精华内容
下载资源
问答
  • 文件传输系统设计文档

    千次阅读 2011-04-10 22:28:00
    文件传输系统设计文档   1引言. 2 1.1编写目的... 2 1.2背景... 2 1.3部分用到的词定义... 2 2程序详细设计. 3 2.1程序描述... 3 2.2功能... 3 2.3性能... 10...

    文件传输系统设计文档

     

    1引言. 2

    1.1编写目的... 2

    1.2背景... 2

    1.3部分用到的词定义... 2

    2程序详细设计. 3

    2.1程序描述... 3

    2.2功能... 3

    2.3性能... 10

    2.4模块划分... 10

    2.5程序系统的结构... 11

    2.5.1串行化的传输. 11

    2.5.2并行的传输. 11

    2.5.3SOCKET类的封装. 12

    2.5.4SOCKET的TCP连接流程图. 12

    2.5.5服务器端数据流图.. 13

    2.5.6客户端数据流图.. 14

    2.6接口/类具体设计. 16

    2.7任务分配... 18

    2.8尚未解决的问题... 18

    2.9 BUG记录... 18

     


    1引言

    1.1编写目

    按照公司布置的实习任务,实现文件传输系统,并完成代码的撰写,在编写代码的过程中,对学过的专业知识进行回顾,加强编写代码的能力和逻辑思维能力,初步掌握C++网络编程原理。在撰写设计文档的过程中,对一个项目的设计开发过程进行梳理,熟悉设计文档编写的规范和要求,为今后项目开发打下坚实的基础。

    1.2背景

        该项目是在Visual C++MFC进行的开发,要求对C++语言熟练的掌握,系统的开发涉及到网络原理的SOCKET编程和操作系统的多线程编程技术。文件传输功能成为现在流行的即时通信工具不可少的一部分。要实现一个功能较完善的文件传输工具,若只能实现文件的发送与接收,显然是不够的。本文开发的文件传输工具,通过使用多线程、自定义的传输命令等技巧,实现了多个用户之间并发传输多个文件,并可以在传输过程进行简单交互的功能。

    1.3部分用到的词定义

        Socket:通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

    CSocket:是MFCWindows Socket编程的类的封装,其派生于CAsyncSocket类,即是CAsyncSocket类的更抽象的封装,用该类来完成Socket编程将更方便。

    串行化:将对象存储到介质(如文件、内在缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的字节byte数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。

    TCPTransmission Control Protocol 传输控制协议,是一种面向连接的、可靠的、基于字节流的运输层通信协议。

    多线程为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。

    2程序详细设计

    2.1程序描述

    2.1.1 利用socket进行TCP连接

       文件传输系统包括一个服务器端和一个客户端。接收方是TCP的服务器端,发送方是TCP的客户端。

    2.1.2 同步的多线程传输方式

       要实现并行传输,即服务器端可以同时接收几个客户端发送的文件,我们采用了同步的多线程方式,在程序中有两类线程:接收线程和发送线程,其中监听线程在接收端,发送线程在发送端。

    2.1.3发送端与接收端的交互

       a.发送端询问接收端,是否同意接收文件以及接收端的应答。

       b.在传输过程中发送端取消文件发送。

       c.在传输过程中接收方取消文件接收。

    2.2功能

    1. 文件在传输过程时应不影响用户界面其它的操作;

    2. 在正式传输文件前,发送方应先发送请求,接收方可以同意或拒绝文件发送,接收方同意后才能进行传输;

    3. 客户端在文件传输过程中,可以显示文件的信息,如文件名,保存路径,文件大小;以及显示传输进度,如完成的百分比,速度;

    4. 文件在传输过程中接收方和发送方都可以取消文件传输过程;

    5. 可以多个客户端同时向服务器并行发送文件;

    6.传输过程中,服务器端和客户端可以进行对话。

     

    l  功能界面图:

    1-1客户端操作界面

    1-2服务器操作界面

     

     

     

     

     

     

     

    l  客户端的用例图:

     

    1-3 客户端用例图

     

    客户端用例描述:

    用例1:连接

    参与者:  客户端用户

    前置条件:1、启动Client.exe

              2、设置好正确的IP地址和端口

    后置条件:与服务器端建立连接 

    触发条件:点击连接

    正常流程:1、创建客户端套接字

              2、与服务器建立连接

              3、初始化套接字 

    异常流程:1IP地址为空,提示IP地址不能为空

              2、客户端连接套接字创建失败,消息对话框提示

              3、客户端连接套接字连接失败,消息对话框提示

              4、服务器的问题,消息对话框提示

    •  
      •  
        • 初始化错误
        • 对方没有启动
        • 对方已经关闭
        • 连接的尝试被拒绝
        • 在一个非套接字上尝试了一个操作
        • 特定的地址已在使用中
        • 与主机的连接被关闭 
        • 一般性错误          

     

    用例2:断开

    参与者:客户端用户 

    前置条件:与服务器端连接 

    后置条件:与服务器端断开连接

    触发条件:点击断开

    正常流程:1、告诉服务器连接被断开

                  2、关闭客户端套接字

                  3、弹出消息对话框,断开

    异常流程:

     

     

    用例3:浏览文件

    参与者:客户端用户

    前置条件:启动Client.exe

    后置条件:1、显示文件路径

                  2、显示文件大小

    触发条件:点击浏览文件

    正常流程:1、选择文件

                 2、获取文件路径,文件名

                 3、打开文件

                 4、获取文件大小

                 5关闭文件 

    异常流程:

     

     

    用例4:发送

    参与者:客户端用户

    前置条件: 1、已连接到服务器端

                   2、已经选定文件 

    后置条件:将文件发送到服务器端

    触发条件:点击发送

    正常流程: 1、向服务器发送文件名和文件大小,请求发送

               2、当对方同意且准备好接收文件时,启动文件发送线程

               3、发送文件

    异常流程: 1、连接的请求被拒绝

                   2、服务器已经关闭了连接,提示对方已关闭

                   3、发送文件的请求被拒绝,提示

                   4、对方取消了发送 

     

     

     

    用例5:取消发送

    参与者:客户端用户

    前置条件:文件正在发送中 

    后置条件:发送过程被取消

    触发条件:点击“取消”

    正常流程:1、弹出“取消确认”对话框

              2、进入扩展用例1

     

     

     

    用例6:退出

    参与者:客户端用户

    前置条件: client.exe在运行过程中

    后置条件:弹出“取消确认”对话框

    触发条件:点击“退出”

    正常流程:1、弹出“退出确认”对话框

              2、进入扩展用例2

    异常流程:        

     

     

    用例7:聊天

    参与者:客户端用户

    前置条件: client.exe在运行过程中

    后置条件: 信息发送到服务器端

    触发条件: 按回车键,或点击“发送”

    正常流程: 1、在“text”上输入信息

               2、按回车键,或点击“发送”         

    异常流程:        

     

     

    扩展用例1:取消确认

    参与者:客户端用户

    前置条件:点击“取消”

    前置条件: 点击“取消”

    后置条件: 1、确认取消,停止传输文件,告诉对方发送被取消

               2、不取消,则返回继续传输

    触发条件:点击“取消确认”

    正常流程:若确认取消

    异常流程     

     

     

    扩展用例2:退出确认

    参与者: 客户端用户

    前置条件: 点击“退出”

    后置条件: 1、确认退出,停止传输文件

               2、不退出,则返回程序中

    触发条件:点击“退出确认”

    正常流程:1、如果正在文件传输过程中,弹出信息提示“请先停止传送后再退出

              2、断开连接

              3、消除对话框

           

     

     

    l  服务器端用例图:

     

                      1-4 服务器用例图

     

    服务器用例描述:

    用例1:启动

    参与者: 服务器端用户

    前置条件: 运行server.exe

    后置条件: 对客户端进行监听

    触发条件:点击“启动”

    正常流程:1、创建客户端连接字CCListenSocket

              2、监听客户端连接

    异常流程:        

     

    用例2:关闭

    参与者: 服务器用户

    前置条件:监听客户端

    后置条件:关闭服务器套接字

    触发条件:点击“关闭”

    正常流程:关闭服务器套接字

    异常流程:        

     

    用例3:取消

    参与者:服务器用户

    前置条件:文件在传输过程中

    后置条件:文件停止传输

    触发条件:点击“取消”

    正常流程:1、弹出“取消确认”对话框

              2、进入扩展用例1

    异常流程:       

     

    用例4:退出

    参与者: 服务器端用户

    前置条件:运行server.exe

    后置条件:弹出“取消确认”对话框

    触发条件:点击“退出”

    正常流程:1、弹出“退出确认”对话框

              2、进入扩展用例2

    异常流程:        

     

    用例5: 聊天

    参与者: 服务器端用户

    前置条件:运行server.exe

    后置条件:向服务器端群发消息

    触发条件:输入“回车”,或点击“发送”

    正常流程:1、在“text”中输入信息

              2、输入“回车”,或点击“发送”

    异常流程:        

     

     

    扩展用例1:取消确认

    参与者: 服务器端用户

    前置条件: 点击“取消”

    后置条件: 1、确认取消,停止传输文件,告诉对方发送被取消

               2、不取消,则返回继续传输

    触发条件:点击“取消确认”

    正常流程:若确认取消

    异常流程:        

     

    扩展用例2: 退出确认

    参与者:服务器端用户

    前置条件: 点击“退出”

    后置条件: 1、确认退出,停止传输文件

               2、不退出,则返回程序中

    触发条件:点击“退出确认”

    正常流程: 1、如果正在文件传输过程中,弹出信息提示“请先停止传送后再退出

               2、断开连接

               3、消除对话框

     

    异常流程:        

     

    2.3性能

     1、可传输大型文件,大于50M

    2、客户端在传输大型文件的同时,还可与服务器端进行会话

    3、一个服务器端可以接收多个客户端的并发传输

    4、多客户端进行并行传输时速度达到每秒1M左右

    2.4模块划分

        在用例图中已进行分析。

    2.5程序系统的结构

        这个程序所采用的是基于TCP/IP协议的Winsock编程原理,这种编程模型一般都是采用客户机/服务器Client/Server方式,在这个程序里面也正是采用这种基本的方法。
         
    在通信的时候主要可以分为两个部分,一个部分是用于传送控制信息,例如发送文件的请求,文件的名称、大小等,由于这方面的数据量比较小,为了方便起见我采用了MFC所提供的CSocket类的串行化技术来实现;而另一个部分就是文件的传输部分,对于文件的传输,由于数据量相对来说比较大,所以我分别写了两个线程,一个用于发送,一个用于接收。这两个部分在具体实现的时候分别建立有自己的套接字Socket

    2.5.1串行化的传输

       程序传送控制信息的时候采用的是CSocket类的串行化技术,这样一来使得发送和接收网络数据就像普通的数据串行化一样简单。封装一个可以串行化的消息类,消息的发送和接收只需使用流操作符对缓冲区进行存取就可以了。根据程序的需要,对消息类的CMessage的构造函数进行了重载,CMessage()为默认的构造函数,如果只是发送一般的控制信息我们可以使用CMessage(int nType)构造函数,当需要发送文件名及客户端的编号的时候我们可以使用CMessage(int nType, CString strFileName, DWORD nCount)构造函数,

    2.5.2并行的传输

    要实现并行传输,即服务器端可以同时接收几个客户端发送的文件,我们采用了同步的多线程方式,在程序中主要有两类线程:_SendThread(发送线程)和_ListenThread(接收线程)。在发送线程中实现了创建客户端套接字,连接服务器端,调用主对话框类中的SendFile成员函数进行文件的发送;在接收线程中实现了创建服务器端套接字,对客户端进行监听,向主对话框发送一个自定义消息WM_ACCEPT_TRANSFERS,发送一个信息告诉发送方可以开始发送文件,接受连接,调用主对话框类中的ReceiveFile成员函数进行文件的接受。

    2.5.3 SOCKET类的封装

    服务器端:

    1.        CListenSocket

    CListenSocket是负责监听管理的套接字类;CListenSocket(CFileTransfersDlg* pdlgMain)为重载的构造函数;m_pdlgMain为指向主对话框类CServerDlg的指针。重载基类CsocketOnAccept函数以使对来自客户的连接请求作出响应, 当该套接字接收到客户的连接请求时,就调用CServerDlg对象的ProcessAccept()函数进行处理。

    2.        CTransferSocket

    CTransferSocket是负责初始化、传送与接收串行化消息的类,继承于CSocket参数m_pFile为一个CSocketFile类型的指针用于连接到一个CSocket对象;m_pArchiveInm_pArchiveOut均为CArchive类型的指针,分别用于接受和发送。该类重写了CSocket中的OnReceive函数,当有消息在Carchive对象提供的缓冲区中,CTransferSocket自动调用OnReceive函数,用以处理客户端发送过来的消息。Init成员函数用于串行化的初始化,Abort成员函数用于对m_pArchiveOut指针进行释放,SendMsg成员函数用于发送信息,ReceiveMsg成员函数用于接受信息。

    客户端:

    1.        CClientSocket

    CClientSocket作用与服务器端的CTransferSocket类作用基本相同,OnReceive函数实现有所不同。

    2.5.4  SOCKETTCP连接流程图 

    2-1 服务器与客户端连接流程图

     

     

     

     

    2.5.5服务器端数据流图

    2-2 服务器端数据流图

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    2.5.6客户端数据流图

     

    2-3 客户端数据流图

     

     

     

     

     

     

     

     

     

     

     

     

     

    2.6接口/类具体设计

    l  文件传输过程的交互图

     

    2-4 文件传输交互图

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    l  类图设计

     

     

     

     

     

     

    2.7任务分配

    代码部分:

    施余主要负责服务器端的开发,张一负责客户端的开发

    设计文挡部分:

    张一负责整个文档的初稿,施余负责后期的修改

    2.8尚未解决的问题

    1、传输速率有待进一步提高,可以将一个文件拆分成多个数据包进行多线

    程传输。

    2服务器无法定向中止某一个客户端传输文件,只能终止所有客户端的文件传输

    2.9 BUG记录

    序号

    Bug描述

    原因

    解决方法

    1

    多个客户端连接服务器后,最后一个连接的客户端可以发送文件,之前连接的客户端无法发送文件

    服务器端保存的客户 socket为最后一个申请连接的客户端

    服务器给每个连接的客户端一个编号,并把每个服务器accpet到的客户端socket放入链表

    2

    多个客户端连接服务器,服务器无法向所有客户端群发消息

    原因同序号1

    循环保存所有客户端socket的链表,向每个socket发送消息

    3

    发送聊天消息时,键入“回车”,程序退出

     

    Enter键默认为确定操作

    使“发送消息”按钮为默认按钮,按回车键可以发送消息

    4

    服务器取消保存时,客户端没有收到发送被拒绝的消息,继续以准备传输的状态等待

     

    缺乏一个对服务器没有接收文件的事件的响应

    1、服务器拒绝接收时,同时向客户端发送一个拒绝接收的信息

     

     

    展开全文
  • Java swing实现简单的C/S聊天及文件传输系统

    千次阅读 热门讨论 2017-05-05 20:30:17
    很久没写博客了,这个本为课程设计,忙完了便抽空出来与大家分享一下,以便指正错误。 1、设计一个简单的聊天室程序。...同时,实现了文件传输系统。 2、程序主界面(包含服务器端和客户端)。 3、先后点击

    很久没写博客了,这个本为课程设计,忙完了便抽空出来与大家分享一下,以便指正错误。


    1、设计一个简单的聊天室程序。采用客户/服务器模式,分为客户端程序和服务器端程序。由于服务器只能支持一个客户,实际上是一个点对点通信的程序。客户端程序和服务器程序通过网络交换聊天字符串内容,并在窗口的列表框中显示。同时,实现了文件传输系统。

    2、程序主界面(包含服务器端和客户端)。


    3、先后点击监听和连接按钮即可建立互联。可以发送消息或传输文件。


    4、其他不多说,直接上代码部分:

    服务器:

    public class chatServer extends JFrame implements Runnable,ActionListener{
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = -4929211394401993088L;
    	//private static final int SERVICE_PORT=13;
    	int SERVICE_PORT;
    	DataInputStream in;
    	DataOutputStream out;
    	ServerSocket server;
    	Socket nextClient;
    	JTextField textField,nameField,portField;
    	JTextArea textArea,textArea2;
    	JButton button,fButton;
    	JFileChooser chooser;
    	MyradioButton lisButton,disButton;
    	ButtonGroup group;
    	Font font = new Font("Adobe 黑体 Std",0,16);
    	JLabel label;
    	
    
    	
    	public chatServer() {
    		this.setTitle("Server");
    		init();
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLayout(null);      
            this.setBounds(0, 0, 800, 500);
            this.setResizable(false);
            //this.setLocationRelativeTo(null);
            //this.setUndecorated(true);
            this.setLocation(1000,200);
            this.setVisible(true);	
    	}
    	
    	@Override
    	public void run(){
    		
    		try{
    
    		while(true){
    
    	        System.out.println("Server Start!");
    			if(!lisButton.isSelected()) continue;					
    			textArea.append("开始监听端口"+portField.getText()+"!\n");
    			SERVICE_PORT=Integer.valueOf(portField.getText()).intValue();
    			System.out.println("1");
    			server=new ServerSocket(SERVICE_PORT);
    			System.out.println("2");
    				nextClient = server.accept();
    				textArea.append("收到并接受客户端的连接请求!\n");
    				in=new DataInputStream(nextClient.getInputStream());
    				out=new DataOutputStream(nextClient.getOutputStream());
    			while (true){
    				String strUTF=in.readUTF();
    				if(strUTF.equals("&&close&&")) {disButton.setSelected(true);out.writeUTF("&&close&&");break;}
    	        	if(strUTF.equals("&&file.start&&"))
    	        	{    		
    	        		String fileName =in.readUTF();		        		
    	        		chooser.setSelectedFile(new File(fileName)); 	        		
    	        		int returnVal=chooser.showSaveDialog(this.getContentPane());
    	        		if(returnVal==JFileChooser.APPROVE_OPTION){
    	        			FileOutputStream fos=new FileOutputStream(chooser.getSelectedFile().getAbsolutePath());  
    	        			int data;              
    	        			while(-1!=(data= in.readInt()))         
    	        			{
    	                         fos.write(data);        
    	        			}	        		     			        		
    	        			System.out.println("文件接收完毕");	        		
    	        			textArea.append(fileName+"接收完毕!\n");	        		
    	        			fos.close(); 
    	        			}
    	        		}	
    	        	else
    	        		textArea.append(strUTF+"\n");
    	         }
    			in.close();
    			out.close();
    			server.close();
    			textArea.append("连接已断开!\n");
    
              }
    	    	}catch(Exception e){}
    	}
    	
    
    	
    	
    	void init(){
    		Container con = this.getContentPane();
    		
    		label=new JLabel();
    		label.setBounds(0, 0, 800, 500);
    		
    		button=new JButton("发送消息");
    		button.setFont(font);
    		button.setBounds(670,425,110,30);
    		button.addActionListener(this);
    		con.add(button);
    		
    		fButton=new JButton("选择文件");
    		fButton.setFont(font);
    		fButton.setBounds(550, 425, 110, 30);
    		fButton.addActionListener(this);
    		con.add(fButton);
    		
    		textField=new JTextField();
    		textField.setBounds(10,375,780,40);
    		textField.setFont(font);
    		textField.setOpaque(false);
    		textField.setBorder(null);
    		textField.addKeyListener(new KeyAdapter() {
    		      public void keyPressed(KeyEvent e) {
    		    	 
    			        if(e.getKeyCode()==KeyEvent.VK_ENTER){
    			        	try {
    							out.writeUTF(textField.getText());
    							textField.setText("");
    						} catch (IOException e2) {}
    			        }		        
    			      }
    			    });
    		con.add(textField);
    		
    	
    		//add	
    		nameField=new JTextField();
    		nameField.setBounds(235, 20, 120, 25);
    		nameField.setText("locallhost");
    		nameField.setFont(font);
    		nameField.setOpaque(false);
    		nameField.setBorder(null);
    		con.add(nameField);
    		
    		portField=new JTextField();
    		portField.setBounds(440, 20, 120, 25);
    		portField.setText("1000");
    		portField.setFont(font);
    		portField.setOpaque(false);
    		portField.setBorder(null);
    		con.add(portField);
    		
    		lisButton=new MyradioButton("监听");
    		disButton=new MyradioButton("断开");
    		disButton.setSelected(true);
    		lisButton.setBounds(610, 17, 85, 30);
    		disButton.setBounds(700, 17, 85, 30);
    		lisButton.addActionListener(this);
    		disButton.addActionListener(this);
    		group = new ButtonGroup();
    		group.add(lisButton);
    		group.add(disButton);
    		con.add(lisButton);
    		con.add(disButton);
    		//
    			
    		textArea=new JTextArea();
    		textArea.setBounds(426, 85, 347,265);
    		textArea.setFont(font);
    		textArea.setEditable(false);
    		textArea.setOpaque(false);
    		textArea.setBorder(null);
    		con.add(textArea);		
    		JScrollPane scrollPane = new JScrollPane(textArea);
    		scrollPane.setOpaque(false);
    		scrollPane.setBorder(null);		
    		scrollPane.setBounds(426, 85, 347,265);		
    		con.add(scrollPane);
    		
    		textArea2=new JTextArea();
    		textArea2.setBounds(36, 85, 347,265);
    		textArea2.setFont(font);
    		textArea2.setEditable(false);
    		textArea2.setOpaque(false);
    		textArea2.setBorder(null);
    		con.add(textArea2);		
    		JScrollPane scrollPane2 = new JScrollPane(textArea2);
    		scrollPane2.setOpaque(false);
    		scrollPane2.setBorder(null);		
    		scrollPane2.setBounds(36, 85, 347,265);		
    		con.add(scrollPane2);
    		
    		chooser=new JFileChooser();
    		
    		label.setIcon(new ImageIcon("src\\chat\\icon\\sever.png"));
    		con.add(label);	
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if(e.getSource()==button)
    			try {
    				out.writeUTF(textField.getText());
    				textArea2.append(textField.getText()+"\n");
    				textField.setText("");
    			} catch (IOException e2) {}
    		else if (e.getSource()==fButton) {
    			try {
    				int returnVal=chooser.showOpenDialog(this);
            		if(returnVal==JFileChooser.APPROVE_OPTION){
            			String filePath = chooser.getSelectedFile().getAbsolutePath();			
            			String fileName = chooser.getSelectedFile().getName();	
            			
            			out.writeUTF("&&file.start&&");			        	
            			out.writeUTF(fileName);	 	 
            				textArea.append("开始发送"+fileName+"...\n");        			
            				FileInputStream fileInputStream=new FileInputStream(filePath);			        			
            				int data;			        			
            				while(-1!=(data=fileInputStream.read())){				       				
            					out.writeInt(data);		        			
            				}        			
            				out.writeInt(data);        			
            				fileInputStream.close();       			
            				System.out.println("文件已发送完毕");      			
            				textArea.append(fileName+"发送完毕!\n");
            		}
    			}catch(IOException e3){}
    		}
    		else if(e.getSource()==disButton)
    		{
    			try {
    				out.writeUTF("&&close&&");
    			} catch (IOException e2) {}
    		}
    	}	
    
    }
    
    class MyradioButton extends JRadioButton{
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	
    	public MyradioButton(String type){
    		super();
    		this.setOpaque(false);
    		setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    		if(type.equals("监听")){		
    			setSelectedIcon(new ImageIcon("src\\chat\\icon\\lis_1.png"));			
    			setIcon(new ImageIcon("src\\chat\\icon\\lis_0.png"));
    		}else if (type.equals("连接")) {		
    			setSelectedIcon(new ImageIcon("src\\chat\\icon\\con_1.png"));		
    			setIcon(new ImageIcon("src\\chat\\icon\\con_0.png"));			
    		}else if (type.equals("断开")) {
    			setSelectedIcon(new ImageIcon("src\\chat\\icon\\dis_1.png"));
    			setIcon(new ImageIcon("src\\chat\\icon\\dis_0.png"));			
    			}
    	}
    }


    客户端:

    public class chatClient extends JFrame implements Runnable,ActionListener{
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = -7103711638195532808L;
    	//private static final int SERVICE_PORT=13;
    	int SERVICE_PORT;
    	DataInputStream in;
    	DataOutputStream out;
    	ServerSocket server;
    	Socket socket;
    	String hostname;
    	JTextField textField,nameField,portField;
    	JTextArea textArea,textArea2;
    	JButton button,fButton;
    	JFileChooser chooser;
    	MyradioButton conButton,disButton;
    	ButtonGroup group;
    	Font font = new Font("Adobe 黑体 Std",0,16);
    	JLabel label;
    
    		
    	public chatClient(){
    		this.setTitle("Client");
    		init();
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLayout(null);      
            this.setBounds(0, 0, 800, 500);
            this.setResizable(false);
    //        this.setLocationRelativeTo(null);
    //        this.setUndecorated(true);
            this.setLocation(200, 200);
            this.setVisible(true);	
    	}
    	@Override
    	public void run() {
    		while(true){
    		try{
    			Thread.sleep(500);
    
    			if(!conButton.isSelected()) continue;
    			SERVICE_PORT=Integer.valueOf(portField.getText()).intValue();
    			//hostname=nameField.getText();
        		socket=new Socket(hostname,SERVICE_PORT);
        		in=new DataInputStream(socket.getInputStream());
        		out=new DataOutputStream(socket.getOutputStream());
        		textArea.append("连接服务器成功!\n");
             while(true){
            	 String strUTF=in.readUTF();
            	 if(strUTF.equals("&&close&&"))  {disButton.setSelected(true);out.writeUTF("&&close&&");break;}
    	        	if(strUTF.equals("&&file.start&&"))
    	        	{    		
    	        		String fileName =in.readUTF();		        		
    	        		chooser.setSelectedFile(new File(fileName)); 	        		
    	        		int returnVal=chooser.showSaveDialog(this.getContentPane());
    	        		if(returnVal==JFileChooser.APPROVE_OPTION){
    	        			FileOutputStream fos=new FileOutputStream(chooser.getSelectedFile().getAbsolutePath());  
    	        			int data;              
    	        			while(-1!=(data= in.readInt()))         
    	        			{
    	                         fos.write(data);        
    	        			}	        		     			        		
    	        			System.out.println("文件接收完毕");	        		
    	        			textArea.append(fileName+"接收完毕!\n");	        		
    	        			fos.close(); 
    	        			}
    	        	}
    	        	else
    	        		textArea.append(strUTF+"\n");
    	         }
             in.close();
             out.close();
             textArea.append("连接已断开!\n");
        	}catch(Exception e){}
    	}
    	}
    	
    	void init(){
    		Container con = this.getContentPane();
    		
    		label=new JLabel();
    		label.setBounds(0, 0, 800, 500);
    		
    		button=new JButton("发送消息");
    		button.setFont(font);
    		button.setBounds(670,425,110,30);
    		button.addActionListener(this);
    		con.add(button);
    		
    		fButton=new JButton("选择文件");
    		fButton.setFont(font);
    		fButton.setBounds(550, 425, 110, 30);
    		fButton.addActionListener(this);
    		con.add(fButton);
    		
    		textField=new JTextField();
    		textField.setBounds(10,375,780,40);
    		textField.setFont(font);
    		textField.setOpaque(false);
    		textField.setBorder(null);
    		textField.addKeyListener(new KeyAdapter() {
    		      public void keyPressed(KeyEvent e) {
    		    	 
    			        if(e.getKeyCode()==KeyEvent.VK_ENTER){
    			        	try {
    							out.writeUTF(textField.getText());
    							textField.setText("");
    						} catch (IOException e2) {}
    			        }		        
    			      }
    			    });
    		con.add(textField);
    		
    	
    		//add	
    		nameField=new JTextField();
    		nameField.setBounds(235, 20, 120, 25);
    		nameField.setText("locallhost");
    		nameField.setFont(font);
    		nameField.setOpaque(false);
    		nameField.setBorder(null);
    		con.add(nameField);
    		
    		portField=new JTextField();
    		portField.setBounds(440, 20, 120, 25);
    		portField.setText("1000");
    		portField.setFont(font);
    		portField.setOpaque(false);
    		portField.setBorder(null);
    		con.add(portField);
    		
    		conButton=new MyradioButton("连接");
    		disButton=new MyradioButton("断开");
    		disButton.setSelected(true);
    		conButton.setBounds(610, 17, 85, 30);
    		disButton.setBounds(700, 17, 85, 30);
    		conButton.addActionListener(this);
    		disButton.addActionListener(this);
    		group = new ButtonGroup();
    		group.add(conButton);
    		group.add(disButton);
    		con.add(conButton);
    		con.add(disButton);
    		//
    			
    		textArea=new JTextArea();
    		textArea.setBounds(426, 85, 347,265);
    		textArea.setFont(font);
    		textArea.setEditable(false);
    		textArea.setOpaque(false);
    		textArea.setBorder(null);
    		con.add(textArea);		
    		JScrollPane scrollPane = new JScrollPane(textArea);
    		scrollPane.setOpaque(false);
    		scrollPane.setBorder(null);		
    		scrollPane.setBounds(426, 85, 347,265);		
    		con.add(scrollPane);
    		
    		textArea2=new JTextArea();
    		textArea2.setBounds(36, 85, 347,265);
    		textArea2.setFont(font);
    		textArea2.setEditable(false);
    		textArea2.setOpaque(false);
    		textArea2.setBorder(null);
    		con.add(textArea2);		
    		JScrollPane scrollPane2 = new JScrollPane(textArea2);
    		scrollPane2.setOpaque(false);
    		scrollPane2.setBorder(null);		
    		scrollPane2.setBounds(36, 85, 347,265);		
    		con.add(scrollPane2);
    		
    		chooser=new JFileChooser();
    		
    		label.setIcon(new ImageIcon("src\\chat\\icon\\client.png"));
    		con.add(label);	
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if(e.getSource()==button)
    			try {
    				out.writeUTF(textField.getText());
    				textArea2.append(textField.getText()+"\n");
    				textField.setText("");
    			} catch (IOException e2) {}
    		else if (e.getSource()==fButton) {
    			try {
    				int returnVal=chooser.showOpenDialog(this);
            		if(returnVal==JFileChooser.APPROVE_OPTION){
            			String filePath = chooser.getSelectedFile().getAbsolutePath();			
            			String fileName = chooser.getSelectedFile().getName();	
            			
            			out.writeUTF("&&file.start&&");			        	
            			out.writeUTF(fileName);	 	 
            				textArea.append("开始发送"+fileName+"...\n");        			
            				FileInputStream fileInputStream=new FileInputStream(filePath);			        			
            				int data;			        			
            				while(-1!=(data=fileInputStream.read())){				       				
            					out.writeInt(data);		        			
            				}        			
            				out.writeInt(data);        			
            				fileInputStream.close();       			
            				System.out.println("文件已发送完毕");      			
            				textArea.append(fileName+"发送完毕!\n");
            		}
    			}catch(IOException e3){}
    		}
    		else if(e.getSource()==disButton)
    		{
    			try {
    				out.writeUTF("&&close&&");
    			} catch (IOException e2) {}
    		}
    	}
    
    
    }

    为了方便调试,main直接启用服务器和客户端两个线程:
    public class mainTest {
    
    	public static void  main(String[] args) {
    		try {
    			for(LookAndFeelInfo info:UIManager.getInstalledLookAndFeels()){
    				if("Windows".equals(info.getName()))
    				{
    					UIManager.setLookAndFeel(info.getClassName());
    					break;
    				}
    			}
    		} catch (Exception e) {
    			// TODO: handle exception
    		}
    		chatServer server=new chatServer();
    		chatClient client=new chatClient();
    		new Thread(server).start();
    		new Thread(client).start();
    	
    	}
    }


    展开全文
  • C/S架构的简单文件传输系统的实现

    千次阅读 2017-04-18 10:06:30
    转载前注明出处 欢迎转载分享 实现代码github仓库地址:戳这里... 课程要求: 相关函数: (一)C/S即客户端(client)与服务器(server),简单文件传输系统的实现运用了网络编程中socket套接字等
    转载前注明出处欢迎转载分享
    实现代码github仓库地址戳这里(https://github.com/chensguo8099/network_programming/tree/master/Serv_sendfiles_to_Client)

    课程要求:
    C/S架构的简单文件传输系统的实现

    相关函数:
    (一)C/S即客户端(client)与服务器(server),简单文件传输系统的实现运用了网络编程中socket套接字等相关知识,客户端与服务器建立连接用到了许多网络编程相关API函数:
    client:connect
    server:bind listen accept
    参考相关内容:戳这里(http://blog.sina.com.cn/s/blog_12c2b05e90102x6rl.html)


    (二)在客户端与服务器建立连接之后我们再使用文件相关知识对服务器端文件内容读出发送至TCP缓冲区,之后再由TCP缓冲区发送至客户端本地空文件中,即实现了服务器与客户端的文件传输功能。其中发送至TCP缓冲区和从TCP缓冲区取数据的过程用到了send,recv函数。
    #include < sys/types.h>
    #include < sys/socket.h>
    ssize_t send(int sockfd, const void*buf, size_t len, int flags);
    int sockfd:accept函数返回的文件描述符
    const void* buf:为要发送的缓冲区地址
    size_t len:即为发送数据的大小
    int flags:一般填0即可

    #include < sys/types.h>
    #include < sys/socket.h>
    ssize_t recv(int sockfd, void* buf,size_t len, int flags);
    int sockfd:套接字文件描述符
    void* buf:为要发送的缓冲区地址
    size_t len:即为发送数据的大小
    int flags:一般填0即可


    (三)实现该任务还用到了对文件的读写操作,我们应当将文件数据在服务器端读取出来并发送,然后在客户端创建一个空文件,再将客户端接收到的数据读入到该空文件中,用到了read和write函数。
    #include < unistd.h >
    ssize_t read(int fd, void* buf, size_tcount);
    int fd:当打开一个文件时open函数所返回的文件描述符
    void* buf:即为从文件读数据至缓冲区
    size_t count:即为读取数据的大小

    #include < unistd.h>
    ssize_t write(int fd, const void* buf,size_t count);
    int fd:当打开一个文件时open函数所返回的文件描述符
    void* buf:即为把缓冲区数据写至文件
    size_t count:即为读取数据的大小


    遇到的问题:
    • 开始错误理解为服务器端向客户端发送文件名,之后客户端响应到该文件名并且将该文件发送至服务器端。其中客户端响应服务器发来的文件名时用了strcmp字符串比较函数来确认服务器所发送的文件名在客户端是否存在。
    • 理解正确后,在实现数据的发送接收时,起初用到的是c++中的流式输入输出文件(c语言的文件掌握不熟练),但在实现mp3数据传输时未能达到预期效果,然后学习了open,read,write这样的函数,并且去运用,完成了数据流的读出和写入。

    代码展示:
    1.头文件:
     unp.h (head file) 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #ifndef __unp_h
    #define __unp_h

    #include < sys/stat.h>
    #include < fcntl.h>
    #include < sys/types.h>
    #include < sys/socket.h>
    #include < netinet/in.h>
    #include < arpa/inet.h>
    #include < stdio.h>
    #include < string.h>
    #include < stdlib.h>
    #include < sys/un.h>
    #include < unistd.h >

    //c++ headfile
    #include <iostream >
    #include < fstream>
    #include < iomanip>
    #include < cstdio>
    using namespace std;

    #ifndef HAVE_BZERO
    #define bzero(ptr, n) memset(ptr, 0, n)
    #endif  //bzero

    #define MAXLINE 4096
    #define LISTENLINE 1024
    #define SA struct sockaddr

    #endif




    2.服务器(server)
     c++ code (server)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61

    #include "unp.h"

    int main(int argc, char **argv)
    {
        
    int sockfd;
        
    char sendname[256] = "0";
        
    char recvline[MAXLINE + 1] = "0";
        
    struct sockaddr_in servaddr;

        sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        
    //AF_INET is IPv4
        //int sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if(sockfd < 0)
        {
            printf(
    ">>create socket error < 0");
            exit(
    1);
        }

        bzero(&servaddr, 
    sizeof(servaddr));
        
    //memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(
    9500);

        
    if(bind(sockfd, (SA *)&servaddr, sizeof(servaddr)) < 0)
        {
            printf(
    ">>bind error\n");
            exit(
    1);
        }
    //bind socket

        
    if(listen(sockfd, LISTENLINE) < 0)
        {
            printf(
    ">>listen error\n");
            exit(
    1);
        }
    //listen socket

        
    int connfd = accept(sockfd, (SA *)NULLNULL);
        
    if(connfd < 0)
        {
            printf(
    ">>accept error\n");
            exit(
    1);
        }
    //accept message

        
    //------------------send mp3 name----------------------
        read(STDIN_FILENO, sendname, sizeof(sendname));
        send(connfd, sendname, 
    sizeof(sendname), 0);
        
    //-----------------------------------------------------
        int fd = open("music.mp3"'r');
        
    char buffer[2048];
        
    while(1)
        {
            
    if(read(fd, buffer, sizeof(buffer) - 1))
            {
                send(connfd, buffer, 
    sizeof(buffer) - 10);
            }
            
    else
                
    break;
        }
        close(fd);
        exit(
    0
    );
    }




    3.客户端(client)
     c++ code (client)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47

    #include "unp.h"

    int main(int argc, char **argv)
    {
        
    int sockfd;
        
    char recvname[256] = "\0";
        
    struct sockaddr_in servaddr;

        
    if(argc != 3)
        {
            printf(
    ">>please input IP and PORT\n");
            exit(
    1);
        }

        
    //create socket
        sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        
    if(sockfd < 0)
        {
            printf(
    ">>create socket error\n");
            exit(
    1);
        }

        
    //init servaddr
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(
    9500);

        
    int connfd = connect(sockfd, (SA *)&servaddr, sizeof(servaddr));
        
    if(connfd < 0)
        {
            printf(
    ">>connect error\n");
            exit(
    1);
        }
        
    //-------------------recv mp3 name--------------------
        recv(sockfd, recvname, sizeof(recvname), 0);
        printf(
    ">>mp3 name is : %s\n", recvname);
        
    //----------------------------------------------------
        char buffer[2048];
        
    int fd = open("NEWmusic.mp3", O_RDWR | O_CREAT);
        
    while(recv(sockfd, buffer, sizeof(buffer) - 10) > 0)
        {
            write(fd, buffer, 
    sizeof(buffer));
        }
        close(fd);
        exit(
    0
    );
    }


    运行截图:
    1.启动服务器:
    C/S架构的简单文件传输系统的实现

    2.启动客户端,连接ip为127.0.0.1 连接端口为9500
    C/S架构的简单文件传输系统的实现


    3.服务器发送要发送的文件的名字
    C/S架构的简单文件传输系统的实现

    4.随即发送了服务器端的music.mp3文件
    C/S架构的简单文件传输系统的实现

    5.客户端响应服务器的发送,并且收到文件
    C/S架构的简单文件传输系统的实现

    6.客户端收到的文件为NEWmusic.mp3
    C/S架构的简单文件传输系统的实现

    7.该新文件的内容如图,与music.mp3一样
    C/S架构的简单文件传输系统的实现


    总结:
    本次设计使我了解socket套接字间通信的过程,并熟悉了文件数据的读出和写入。


    展开全文
  • 系统整体设计思路及上传、下载文件的设计方案、断点续传的原理及设计、秒传的原理及设计、数据库设计API编程与shell脚本的设计、大文件传输原理及实现、使用sendfile()实现“零拷贝”机制、实现高并发——负载均衡...


    Chat 分享目录

    在这里插入图片描述


    GitChat 分享地址

    本篇主题我做了一次Chat分享,现在文章已经发布,链接如下:

    https://gitbook.cn/gitchat/activity/5cecf4db71f35173c060c4c7

    直接登录预订便可阅读文章,如下图。
    在这里插入图片描述


    系统演示

    我们首先启动客户端,以 root 用户身份登录(已经注册),然后进入系统主页面,可以通过输入 help 来查看命令帮助,然后我们可以通过 get 命令下载文件,put 命令上传文件,还可以使用各种文件操作命令,当服务器端已存储该文件信息后,再次 put 相同文件时,可以直接秒传。如下图:
    enter image description here

    我们以普通用户登录,同样可以通过输入 help 来查看命令帮助,然后我们可以通过 get 命令下载文件,put 命令上传文件等,当服务器端已存储该文件信息后,再次 put 相同文件时,可以直接秒传。但是普通用户不可以删除文件,也不可以查看服务器的进程信息,如下图:
    enter image description here

    接下来我们看一下系统的断点续传功能和下载条件控制功能演示,首先 zy 用户向服务器上传 master.mp4 视频文件,上传一半后客户端终止,因此服务器保存的是不完整的文件信息。
    enter image description here

    接着 yb 用户登录,它要下载该文件系统显示文件不完整,不允许下载。
    enter image description here

    之后 zy 用户再次登录系统,然后继续上传该文件,我们通过下图可以看到,之前的文件并没有重新传输,而是从断点处续传了。
    enter image description here

    接下来我们看一下用户管理的注册部分,注册时若用户名和已存在的用户名相同,则系统会给出提示要求重新注册,注册成功后,系统给出登录界面,用户可以进行登录操作进入系统。
    enter image description here

    接下来我们演示一下大文件的传输和断点续传的过程,我们下面演示的示例传输文件 Ubuntu 是一个 2.3G 的大文件,为了演示大文件断点续传,我们在传输过程中故意切断客户端,如下图所示:
    enter image description here

    接下来我们重新登录并请求下载该文件,可以看到正在续传,如下图所示:
    enter image description here

    经过一段时间的传输,文件传输完毕,我们可以通过 ls 命令查看服务器端的该文件的大小,与我们在客端打印的下载到本地的文件大小相同,说明我们成功将大文件进行了断点续传。
    enter image description here

    最后我们看一种情景,zy 用户上传 master.mp4 视频文件,没有上传完毕便退出了,如下图:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-spxDNH6n-1589125706816)(https://images.gitbook.cn/083da7d0-8707-11e9-96ef-2d807e6b11b2)]

    此时另一个用于 yb 也上传相同文件,那么由于他们不是同一用户,因此该文件必须重传而不能续传,如下图所示:
    enter image description here
    在这里插入图片描述

    展开全文
  • 文件传输系统的优势和重要性!

    千次阅读 2018-10-26 17:49:31
    大文件和存储的数据传输是当今技术领域的主要关注点...主要有三种核心类型的数据传输系统。一种是借助USB和磁盘等硬件设备。另一种方法是通过FTP或文件传输协议,这在某种程度上不太安全; 最后,通过云计算技术通过...
  • 开发日志-文件传输系统之构架

    千次阅读 2006-03-31 06:38:00
    今天准备写一个文件传输系统。它功能主要为传送服务器上的文件。其特性为,P2P加C/S结构。系统中的组成为中央服务器(可含文件服务器)加客户机(文件服务器),采用断点续传的TCP传输方式(分为仿TCP的UDP或TCP传输...
  • Linux C编程连载(4)-基于TCP/IP的文件传输系统

    万次阅读 热门讨论 2011-09-24 15:01:48
    通过Linux C编程,设计一个基于TCP/IP的文件传输系统,实现网络文件的收发。 【设计环境】 VMware WorkStation 6.0.2+Fedora 10 【设计方案】 (1)文件读写 任意文件都可以二进制的方式进行读写,为了实现任意...
  • 文件传输系统较为重要的功能便是断点续传了,使用断点续传可以有效的提高传输效率,提升系统性能。有时候可能下载的文件过大,一次性传输遇到网络问题就很可能传输失败而需要全部重新下载。另外,断点续传还能够提供...
  • 文件传输系统失败的原因总结

    千次阅读 2010-10-19 11:03:00
    1。www-data用户在132和133,133和134、135之间要建立信任,实现无密码的scp。 2。在/data/video/film/2m/201010上缺少指向-> /data1/film/2m/201010的符号链接。
  • Windows系统在安装虚拟机centos系统之后,如何进行两者之间的文件传输和互操作,或者如何在Windows端使用Xshell对Linux端进行远程操作?使用centos的文件上传下载小工具,可以快速的帮助我们从本地上传文件至Linux...
  • 通过免费的FTP传输软件FileZilla实现双向传输,只需将该软件下载到windows下。... 点击进入客户端下载页面,会提示你3.39.0...2. 使用FileZilla传输文件需要SSH服务,Ubuntu作为服务端使用需要安装SSH服务端,参考...
  • 通过SFTP向Windows系统传输文件

    千次阅读 2020-07-07 17:53:24
    使用SFTP服务向Windows系统传输文件,对于Windows系统中的文件传输 二、操作 使用SFTP服务(Linux下自带,个别Windows下需要安装) Windows下载FreeSSHd.exe 官网:http://www.freesshd.com/?ctt=download 下载到...
  • (20端口用于建立数据连接并传输文件数据,21端口用于建立控制连接并传输FTP控制命令) FTP数据连接可以分为主动模式(服务器主动发起数据连接)和被动模式(服务器被动等待书记连接) 二、操作过程 (1)安装 yum ...
  • 目录FastDFS业务场景概述部署FastDFS整合FastDFS和NginxFastDFS与Python交互重写Django项目文件传输行为 FastDFS业务场景概述 基于C语言开发的FastDFS是一项开源轻量级分布式文件系统,主要用于海量数据存储,有方便...
  • FTP文件传输如何用C语言实现 用于文件传输 系统文件更新 急用 点对点
  • 文件系统支持 rz rc 命令传输文件

    千次阅读 2016-09-20 23:12:03
    使用自己刚制作的文件系统,突然发现 rz rc 命令不可用,又不喜欢 tftp ssh nfs 网络文件系统的我瞬间束手无策。又懒得烧友善那个200多M的文件系统,索性让自己的文件系统支持 rz rc 命令吧,简单问了问度娘,再次...
  • TCP、UDP文件传输分析

    千次阅读 2019-04-14 20:08:11
    实现跨物理主机的文件传输系统。 分别使用TCP和UDP协议,利用socket库,完成一个文件传输程序。 文本文件能够跨物理主机在局域网内进行传输。 语言不限(python,java,C,C++,C#)。 分析文件传输的...
  • 导读: ... 大家可以关注我个人公众号,所有分享内容,会在公众号第一时间推送,且阅读排版更好。 愿大家的学习,轻松且愉快。 如果大家觉得有用,希望...其中,我们提到:如果其他外部公司要与自己企业内部的系统有...
  • 文件传输协议介绍

    千次阅读 2019-06-11 16:23:30
    文件传输协议介绍 文件传输协议是一种极为普遍的档案分享服务,让你可以将你的档案从储存装置传送到ASUSTOR NAS。ASUSTOR NAS 所支援的文件传输协议可分为: CIFS (网络文件共享系统) 通常是指 SMB,SAMBA 或 ...
  • 不同系统之间文件传输

    千次阅读 2018-04-12 14:29:56
    1.文件的归档 为了加快不同系统之间的文件传输,我们需要对文件进行归档,即将多个文件变为一个归档文件 (1)建立归档文件 : tar cf 归档文件名称 (2)显示归档文件中的内容:tar t 归档文件名称 (3)向...
  • 日常开发过程中,有些时候可能会用到本机和远程服务器间的文件传输,本文记录的是两台windows电脑间的文件传输,linux系统以后再说。 在mstsc成功建立远程桌面连接后,可以通过如下方式进行传输: 直接粘贴、复制 ...
  • 文件传输协议FTP

    千次阅读 2018-05-11 14:48:31
    文件传输协议FTP(File Transfer Protocol)是因特网中使用最广泛的文件传输协议。FTP使用交互式的访问,允许客户指定文件的类型和格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权...
  • 前几天面试,遇到一个问题,如何使用TCP设计一个批量文件传输系统。 由于TCP是基于字节流的,那么服务端收到源源不断的字节流之后,如何对字节流进行区分,从而还原成不同的文件? 也就是说,应用层的进程如何区分...
  • 基于UDP的文件传输软件 (C#)

    千次阅读 2017-04-05 10:57:30
    选了一门软件开发案例的选修课,得到一项多选一大作业,我们选择了“基于UDP的文件传输系统”这个作业,然后经过需求分析和概要设计,进入编码阶段,因为作业要求有界面,个人认为用C#编写桌面软件比较容易,就选择...
  • 文件是工作生活的日常关键话题,我们经常需要在机器之间传输文件。比如备份,复制数据等等。这个是很常见,也是很简单的。用scp或者rsync就能很好的完成任务。但是如果文件很大,需要占用一些传输时间的时候,怎样又...
  • 一、在spring配置文件里面配置文件上传 &amp;lt;!--文件上传--&amp;gt; &amp;lt;bean name=&quot;multipartResolver&quot; class=&quot;org.springframework.web.multipart.commons.C.....
  • 文件传输:scp /Users/zhangyulei/idea/workspace/jiwooShop-b/target/ROOT.war root@115.159.161.42:/home/tomcat-8.5.40/webapps 获取本地文件地址:将文件 拖入终端。 连接远程服务器:终端-shell-新建远程...
  • Linux与windows文件传输

    千次阅读 2018-12-03 10:28:55
    在我们使用服务器进行开发或日常使用时,常常需要在两个系统之间进行文件的传输,Linux文件传输到Windows(MAC),Windows文件传输到Linux。 如何实现本地机器与服务器之间的文件传输呢?接下来将介绍如何实现。 ...
  • $ scp your_username@remotehost.edu:/some/remote/directory/\{file1,file2,...,filen\} ./

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 731,835
精华内容 292,734
关键字:

文件传输系统