TcpLister和TcpClient进行文件传输

TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议。TCP建立一个连接需要三次握手,而终止一个连接要经过四次握手。一旦通信双方建立了TCP连接,连接中的任何一方都能向对方发送数据和接受对方发来的数据。TCP协议负责把用户数据(字节流)按一定的格式和长度组成多个数据报进行发送,并在接收到数据报之后按分解顺序重新组装和恢复传输的数据。

使用TCP传输文件,可以直接使用socket进行传输,也可以使用TcpLister类和TcpClient类进行传输。其实TcpLister和TcpClient就是Socket封装后的类,是.NET为了简化编程复杂度而对套接字又进行了封装。但是,TcpLister和TcpClient只支持标准协议编程。如果希望编写非标准协议的程序,只能使用套接字socket来实现。

下面分别讲解两种方法进行文件传输:

因为和一些终端进行文件传输时,受发送缓冲区最大发送字节的影响,我这里每次发送512字节,循环发送,直到把文件传输完,然后关闭连接;接收文件时,同样是每次接收512字节,然后写入文件,当所有的数据都接收完时,最后关闭连接。

启动监听和接收文件的代码如下:

复制代码
 
 
TcpListener listener;

#region
服务器启动监听服务,并开始接收文件 private void btnBegin_Click(object sender, EventArgs e) { btnBegin.Enabled = false;
           TcpListener listener=new TcpListener(IPAddress.Parse(txtIp.Text),int.Parse(txtPort.Text));
listener.Start();  
             ShwMsgForView.ShwMsgforView(lstbxMsgView, "服务器开始监听");            
             Thread mythread = new Thread(ReceiveMsg);       //使用多线程
                  mythread.Start(); 
                   mythread.IsBackground = true;
}  
           public void ReceiveMsg(){           
                  while (true)   {               
                       try    {                    
                               int size = 0;                   
                               int len = 0;                   
                   TcpClient client = listener.AcceptTcpClient();                
                     if (client.Connected)     {                      
                              //向列表控件中添加一个客户端的Ip和端口,作为发送时客户的唯一标识              
                    listbOnline.Items.Add(client.Client.RemoteEndPoint);
                ShwMsgForView.ShwMsgforView(lstbxMsgView, "客户端连接成功" +                        
                                                  client.Client.RemoteEndPoint.ToString());
                                }
                NetworkStream stream = client.GetStream();
              if (stream != null)
              {
                 SaveFileDialog sfd = new SaveFileDialog();
                if (sfd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
                {
                  string fileSavePath = sfd.FileName;//获得用户保存文件的路径
         FileStream fs = new FileStream(fileSavePath, FileMode.Create,FileAccess.Write);

                  byte[] buffer = new byte[512];
                while ((size = stream.Read(buffer, 0, buffer.Length)) > 0)
                  {
                      fs.Write(buffer, 0, size);
                       len += size;
                  }
                    fs.Flush();
                    stream.Flush();
                    stream.Close();
                    client.Close();
               ShwMsgForView.ShwMsgforView(lstbxMsgView, "文件接受成功" + fileSavePath);
                      }
                 }
          }
          catch(Exception ex) {
               ShwMsgForView.ShwMsgforView(lstbxMsgView, "出现异常:" + ex.Message);
                }
            }
        }
        #endregion
复制代码

客户端选择文件后,即可直接发送文件:

客户端代码如下:

复制代码
        //使用TcpLister和TcpClient向服务端发送文件
        private void button1_Click(object sender, EventArgs e)
        {
            TcpClient client = new TcpClient();
           
            client.Connect(IPAddress.Parse(txtIp.Text), int.Parse(txtPort.Text));
            NetworkStream ns = client.GetStream();
            FileStream fs = new FileStream(txtFileName.Text, FileMode.Open);
            int size = 0;//初始化读取的流量为0   
            long len = 0;//初始化已经读取的流量   
            while (len < fs.Length)
            {
                byte[] buffer = new byte[512];
                size = fs.Read(buffer, 0, buffer.Length);
                ns.Write(buffer, 0, size);
                len += size;
                //Pro((long)len);   
            }
            fs.Flush();
            ns.Flush();
            fs.Close();
            ns.Close();
            ShowMgs(txtFileName.Text + "文件发送成功");
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值