C#实现文件的发送和接收

为了把问题说清楚,把一些变量都直接附值了,并没有通过输入附值

private string path = "F://SmartMovie.EXE";    //要发送的文件

                      private Socket s;                             

         private void listen()
        {
            string ip = "127.0.0.1";   //远程IP 这里定义为自己的机器
            IPAddress[] ih = Dns.GetHostAddresses(ip);       //获得IP列表

            IPAddress newip = ih[0];      //获取IP地址           
            int port = 6789;              //定义端口
            IPEndPoint Conncet = new IPEndPoint(newip, port);     //构造结点
            s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,  ProtocolType.Tcp);  
                 //初始化socket 

     try
        {
                                  

            s.Connect(Conncet);      //连接远程服务器
            if (s.Connected)         //如果连接成功 s.Connected 则为true 否则为 false
            {


                Console.WriteLine("连接成功");
                Thread t = new Thread(new ThreadStart(set)); //创建进程
                t.Start();                             //开始进程
                Console.WriteLine("发送完毕")      

            }

               }
                catch(NullReferenceException e)
            {

              Console.WriteLine("{0}",e);

            }

            private void set()                       //创建set函数
        {
            Console.WriteLine("开始发送数据");
            byte[] b = new byte[10000000];            //创建文件缓冲区,这里可以认为文件的最大值
            FileStream file = File.Open(path, FileMode.Open,FileAccess.Read);   //创建文件流
            int start = 0;
            int end = (int)file.Length;               //获取文件长度 文件传送如果有需要超过int的范围估计就要改写FileStream类了

      try
          {
            while (end != 0)
            {
                int count = file.Read(b, start, end);      //把数据写进流
                start += count;
                end -= count;
            }
            while (start != 0)
            {
                int n = s.Send(b, end, start, SocketFlags.None);  //用Socket的Send方法发送流
                end += n;
                start -= n;
            }

        
            file.Close();     //关闭文件流

            s.Close();        //关闭Socket
          }  
      catch (NullReferenceException e)
            {
                Console.WriteLine("{0}", e);
            }             
        }   

这样文件发送的模型就实现了

    接下去实现文件的接收,首先要确定对方发送文件的长度,其实上面的那段还要加入发送文件长度的功能,实现很简单,就是发送int变量end ,然后要求接收代码返回一个Boolean确定是否发送,这里为了更简明的说清楚原理并没有实现

             private void get()
        {
            string path = "G://da.exe";  //接收的文件
            FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //写入文件流
            TcpListener listen = new TcpListener(6789);  //监听端口
            Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  //定义Socket并初始化
            try
            {
             listen.Start();        //开始监听
            s1 = listen.AcceptSocket();            //获取Socket连接
            byte[] data = new byte[10000000];      //定义缓冲区
            int longer = data.Length;              
            int start = 0;                
            int mid = 0;
            if (s1.Connected)             //确定连接
            {
                Console.WriteLine("连接成功");
                int count = s1.Receive(data, start, longer, SocketFlags.None);  //把接收到的byte存入缓冲区
                mid += count;
                longer -= mid;
                while (count != 0)
                {
                    count = s1.Receive(data, mid, longer, SocketFlags.None);
                    mid += count;
                    longer -= mid;
                }
                file.Write(data, 0, 1214134); //写入文件,1214134为文件大小,可以用socket发送获得,代码前面已经说明。
                s1.Close();
                file.Close();
            }
            }
                catch(NullReferenceException e)
            {
                    Console.WriteLine("{0}",e);
            }
          }

 
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值