• C#实现局域网文件传输


    网络通信一般都是通过Socket进行的,称为进程通信机制,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。

    先学习一下socket基本原理:

    socket原理:
      在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

    Socket的形像理解:

    socket非常类似于电话插座。以一个国家级电话网为例。

    电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。

    任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。

    然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。

    对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。

    双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。

    通话结束后,一方挂起电话机相当于关闭socket,撤消连接。

    Socket 通信应用示图

    TCP/IP 客户端/服务端通信流程图

    通过Socket通信原理的认识,下面可以开始写一个简单的通信程序,进行验证。

    在这里,做了一个局域网内文件传输程序,其实模仿飞鸽传输的功能。

    在公司里面是禁用QQ,不能使用QQ,有时发现挺麻烦的,传输文件不方便,搞得经常要用U盘来拷东西。

    为此,我设想写一个简单的局域网文件传输入工具,暂时解决不能上QQ的痛苦。

    发送文件代码片段:

          
      /// <summary>
            
    /// 发送文件
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            private void btnSentFile_Click(object sender, EventArgs e)
            {
                
    //打开文件
                OpenFileDialog dlg = new OpenFileDialog();
                
    if (dlg.ShowDialog() == DialogResult.OK)
                {
                    
    for (int i = 0; i < lvwDisplayUser.SelectedItems.Count; i++)
                    {
                        
    string ip = this.lvwDisplayUser.SelectedItems[i].SubItems[2].Text;

                        
    //初始化接受套接字:寻址方案,以字符流方式和Tcp通信
                        socketSent = new Socket(AddressFamily.InterNetwork,
                               SocketType.Stream,
                               ProtocolType.Tcp);

                        
    //设置服务器IP地址和端口
                        ipSent = new IPEndPoint(IPAddress.Parse(ip), 8001);

                        
    //与服务器进行连接
                        LanSocket socketConnet = new LanSocket(socketSent, ipSent);
                        Thread tConnection 
    = new Thread(new ThreadStart(socketConnet.SocketConnect));
                        tConnection.Start();

                        Thread.Sleep(
    100);
                        
    //将要发送的文件加上"DAT"标识符

                        SentLanFile sentFile 
    = new SentLanFile(dlg, socketSent);
                        Thread tSentFile 
    = new Thread(new ThreadStart(sentFile.SentFile));
                        tSentFile.Start();
                    }
                }
            }
      

            /// <summary>
            
    /// 发送文件
            
    /// </summary>
            public void SentFile()
            {
                
    string msg = "0DAT " + dlg.FileName;

                
    //将 "msg" 转化为字节流的形式进行传送
                socketSent.Send(Encoding.Default.GetBytes(msg));

                
    //定义一个读文件流
                FileStream read = new FileStream(dlg.FileName, FileMode.Open, FileAccess.Read);

                
    //设置缓冲区为1024byte
                byte[] buff = new byte[1024];
                
    int len = 0;
                
    while ((len = read.Read(buff, 01024)) != 0)
                {
                    
    //按实际的字节总量发送信息
                    socketSent.Send(buff, 0, len, SocketFlags.None);
                }

                
    //将要发送信息的最后加上"END"标识符
                msg = "END";

                
    //将 "msg" 发送
                socketSent.Send(Encoding.Default.GetBytes(msg));
                socketSent.Close();
                read.Close();
            }

     

     工程源码下载,转载请保留原文地址

    梦想还是要的,万一实现了呢!
  • 相关阅读:
    分布式系统实践解读丨详解高内聚低耦合
    Git:改变世界的一次代码提交
    一分钟带你认识深度学习中的知识蒸馏
    99%的人都能看懂的分布式系统「补偿」机制
    一大波人气博主袭来,现场直播华为全联接2020!
    快速了解前端开发HTML的正确姿势
    华为云IoT智简联接,开启物联世界新纪元
    从一个小程序说起2 C++快速入门03
    从一个小程序说起 C++快速入门02
    PE格式详细讲解6(上) 系统篇06|解密系列
  • 原文地址:https://www.cnblogs.com/cgli/p/2035563.html
Copyright © 2020-2023  润新知