类似QQ文件发送的东西

来源:互联网 发布:java需要掌握的技术 编辑:程序博客网 时间:2024/04/29 10:41
 为了把问题说清楚,把一些变量都直接附值了,并没有通过输入附值                      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);            }          }

原创粉丝点击