- 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);
- }
- }