1.客户端代码 public static void FileMoveInVirtualMachineForCompressor() { var obj = new object(); string ip = "127.0.0.1"; int port = 11000; List<string> files = Directory.GetFiles(@"C:UsersadminDesktopsendFile").ToList(); Dictionary<string, byte[]> infoList = new Dictionary<string, byte[]>(); foreach (var file in files) { byte[] buffer = File.ReadAllBytes(file); infoList.Add(Path.GetFileName(file), buffer); } byte[] bs = Holworth.Utility.HraUtility.CompressionObject(infoList); string toPath = @"C:UsersadminDesktopsendFile"; string toFile = Path.Combine(toPath, DateTime.Now.ToString("yyyyMMdd")+ ".shape"); //将数组写入文件 Stream writer = new FileStream(toFile, FileMode.Create, FileAccess.Write, FileShare.Write); writer.Write(bs, 0, bs.Length); writer.Flush(); writer.Close(); Net.SendFile(ip, port, toFile, 512, 900000); } 2.服务端监听 using SocketIM; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace FileListener { class Program { static void Main(string[] args) { string ip = "127.0.0.1"; int port = 11000; Net.ListenerAcceptFile(ip, port, @"d:ReciveFoder"); MessageBox.Show("监听程序已启动!!"); Console.ReadKey(); } } } 3.Net.cs using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace SocketIM { ////// Net : 提供静态方法,对常用的网络操作进行封装 public class Net { public class ObjectState { public string fileName { get; set; } public Socket workSocket { get; set; } public Thread workThread { get; set; } } private Net() { } ////// 向远程主机发送数据 //////要发送数据且已经连接到远程主机的 Socket///待发送的数据///发送数据的超时时间,以秒为单位,可以精确到微秒///0:发送数据成功;-1:超时;-2:发送数据出现错误;-3:发送数据时出现异常////// 当 outTime 指定为-1时,将一直等待直到有数据需要发送 public static int SendData(Socket socket, byte[] buffer, int outTime) { if (socket == null || socket.Connected == false) { throw new ArgumentException("参数socket 为null,或者未连接到远程计算机"); } if (buffer == null || buffer.Length == 0) { throw new ArgumentException("参数buffer 为null ,或者长度为 0"); } int flag = 0; try { int totalLen = buffer.Length; int sndLen = 0; while (true) { if ((socket.Poll(outTime * 100, SelectMode.SelectWrite) == true)) { // 收集了足够多的传出数据后开始发送 sndLen = socket.Send(buffer, sndLen, totalLen, SocketFlags.None); totalLen -= sndLen; if (totalLen == 0) { // 数据已经全部发送 flag = 0; break; } else { if (sndLen > 0) { // 数据部分已经被发送continue; } else { // 发送数据发生错误 flag = -2; break; } } } else { // 超时退出 flag = -1; break; } } } catch (SocketException e) { flag = -3; } return flag; } ////// 向远程主机发送文件 //////要发送数据且已经连接到远程主机的 socket///待发送的文件名称///文件发送时的缓冲区大小///发送缓冲区中的数据的超时时间///0:发送文件成功;-1:超时;-2:发送文件出现错误;-3:发送文件出现异常;-4:读取待发送文件发生错误////// 当 outTime 指定为-1时,将一直等待直到有数据需要发送 public static int SendFile(string ip, int port, string fileName, int maxBufferLength, int outTime) { IPAddress address = IPAddress.Parse(ip); IPEndPoint endpoint = new IPEndPoint(address, port); //创建服务端负责监听的套接字,参数(使用IPV4协议,使用流式连接,使用TCO协议传输数据) Thread.Sleep(1500); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(endpoint); if (socket.Connected) { Console.WriteLine(socket.RemoteEndPoint + "连接成功"); } if (fileName == null || maxBufferLength <= 0) { throw new ArgumentException("待发送的文件名称为空或发送缓冲区的大小设置不正确."); } int flag = 0; try { var fileBytes = Encoding.UTF8.GetBytes(fileName); var fbs = new byte[100]; for (int i = 0; i < fileBytes.Length; i++) { fbs[i] = fileBytes[i]; } socket.Send(fbs); FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); long fileLen = fs.Length; // 文件长度 long totalLen = fileLen; // 未读取部分 int readLen = 0; // 已读取部分 byte[] buffer = null; if (fileLen <= maxBufferLength) { /* 文件可以一次读取*/ buffer = new byte[fileLen]; readLen = fs.Read(buffer, 0, (int)fileLen); flag = SendData(socket, buffer, outTime); } else { /* 循环读取文件,并发送 */ while (totalLen != 0) { if (totalLen < maxBufferLength) { buffer = new byte[totalLen]; readLen = fs.Read(buffer, 0, Convert.ToInt32(totalLen)); } else { buffer = new byte[maxBufferLength]; readLen = fs.Read(buffer, 0, maxBufferLength); } if ((flag = SendData(socket, buffer, outTime)) < 0) { break; } totalLen -= readLen; } } fs.Flush(); fs.Close(); File.Delete(fileName); socket.Shutdown(SocketShutdown.Both); socket.Close(); } catch (IOException e) { flag = -4; } if (flag == 0) { Console.WriteLine(fileName + "文件发送成功"); socket.Close(); Console.WriteLine("连接关闭"); } else { Console.WriteLine(fileName + "文件发送失败,i=" + flag); } return flag; } private static void WatchConnecting(object info) { ObjectState state = (ObjectState)info; Socket socketWatch = state.workSocket; while (true)//持续不断的监听客户端的请求 { //开始监听 客户端连接请求,注意:Accept方法,会阻断当前的线程 Socket connection = socketWatch.Accept(); if (connection.Connected) { //创建通信线程 Thread thradRecMsg = new Thread(RecMsg); state.workSocket = connection; state.workThread = thradRecMsg; thradRecMsg.IsBackground = true; thradRecMsg.Start(state); } } } ////// 接收消息 private static void RecMsg(object socketClientPara) { string ext = string.Empty; string fileSourcePath = string.Empty; ObjectState state = (ObjectState)socketClientPara; string fileName = state.fileName;//获得用户保存文件的路径 Socket socketClient = state.workSocket; FileStream fs = null; while (true) { //定义一个接受用的缓存区(100M字节数组) //将接收到的数据存入arrMsgRec数组,并返回真正接受到的数据的长度 if (socketClient.Connected) { try { byte[] fileBuffer = new byte[100]; int size1= socketClient.Receive(fileBuffer); fileSourcePath = Encoding.UTF8.GetString(fileBuffer).Trim(); var chs = fileSourcePath.ToCharArray(); var chList = new List<char>(); foreach (var item in chs) { if (item != '