C#Socket文件传输(发送与接收代码)
这里是发送的代码:
SendVarData是转码后发送函数
1 /// <summary> 2 /// 发送文件 3 /// </summary> 4 /// <param name="userName"></param> 5 private void SendFileToClient(string userName) 6 { 7 User targetUser = userListDict[userName]; 8 String targetUserIP = "127.0.0.1"; 9 10 FileInfo EzoneFile = new FileInfo(sendFilePath); 11 FileStream EzoneStream = EzoneFile.OpenRead(); 12 //包的大小 13 int packetSize = 1000; 14 //包的数量 15 int packetCount = (int)(EzoneFile.Length / ((long)packetSize)); 16 17 //最后一个包的大小 18 int lastPacketData = (int)(EzoneFile.Length-((long)packetSize*packetCount)); 19 20 byte[] data = new byte[packetSize]; 21 22 23 24 try 25 { 26 IPHostEntry ipHost = Dns.GetHostEntry(targetUserIP); 27 IPAddress ipAdd = ipHost.AddressList[0]; 28 IPEndPoint ipEndP = new IPEndPoint(ipAdd, targetUser.userPort); 29 30 Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 31 client.Connect(ipEndP); 32 //发送本机昵称 33 FormClient.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(localNickName)); 34 //发送包的大小 35 FormClient.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(packetSize.ToString())); 36 //发送包的总数量 37 FormClient.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(packetCount.ToString())); 38 //client.SendFile(sendFilePath); 39 for (int i = 0; i < packetCount;i++ ) 40 { 41 EzoneStream.Read(data, 0, data.Length); 42 FormClient.SendVarData(client,data); 43 AddReceiveFileInfo(userDialogDict[userName], packetCount.ToString() + "/" + i.ToString()); 44 } 45 if (lastPacketData!=0) 46 { 47 data=new byte[lastPacketData]; 48 EzoneStream.Read(data, 0, data.Length); 49 FormClient.SendVarData(client, data); 50 } 51 AddReceiveFileInfo(userDialogDict[userName], "传输完成!"); 52 53 client.Shutdown(SocketShutdown.Both); 54 client.Close(); 55 56 } 57 catch (System.Exception ex) 58 { 59 60 } 61 } 62 public static int SendVarData(Socket s, byte[] data) 63 { 64 int total = 0; 65 int size = data.Length; 66 int dataleft = size; 67 int sent; 68 byte[] datasize = new byte[4]; 69 datasize = BitConverter.GetBytes(size); 70 sent = s.Send(datasize); 71 72 while (total < size) 73 { 74 sent = s.Send(data, total, dataleft, SocketFlags.None); 75 total += sent; 76 dataleft -= sent; 77 } 78 79 return total; 80 }
以下是接收代码:
ReceiveVarData是接收后转码
1 /// <summary> 2 /// 接受其他客户端的文件 3 /// </summary> 4 private void ReceiveClientFile() 5 { 6 while (true) 7 { 8 9 Socket clientsocket = serverSocket.Accept(); 10 Thread receiveThread = new Thread(ReceiveClientFileData); 11 receiveThread.Start(clientsocket); 12 receiveThread.IsBackground = true; 13 } 14 15 } 16 17 private void ReceiveClientFileData(object clientSocket) 18 { 19 Socket myClientSocket = (Socket)clientSocket; 20 string totalSize;//文件大小 21 int totalCount = 0;//总的包数量 22 int receiveCount = 0;//统计已收的包的数量 23 string sendClientName; 24 25 if (File.Exists(receiveFilePath)) 26 { 27 File.Delete(receiveFilePath); 28 } 29 30 FileStream fs = new FileStream(receiveFilePath, FileMode.Create,FileAccess.Write); 31 //发送端的用户名字,用于确定对话框 32 sendClientName = System.Text.Encoding.Unicode.GetString(FormClient.ReceiveVarData(myClientSocket)); 33 //文件大小 34 totalSize = System.Text.Encoding.Unicode.GetString(FormClient.ReceiveVarData(myClientSocket)); 35 //总的包数量 36 totalCount = int.Parse(System.Text.Encoding.Unicode.GetString(FormClient.ReceiveVarData(myClientSocket))); 37 38 AddReceiveFileInfo(userDialogDict[sendClientName],receiveCount + "/" + totalSize); 39 while (true) 40 { 41 byte[] data = FormClient.ReceiveVarData(myClientSocket); 42 //接收来自socket的数据 43 44 if (data.Length==0) 45 { 46 AddReceiveFileInfo(userDialogDict[sendClientName], "接收完成!"); 47 fs.Write(data, 0, data.Length); 48 break; 49 } 50 else 51 { 52 receiveCount++; 53 AddReceiveFileInfo(userDialogDict[sendClientName], receiveCount + "/" + totalSize); 54 fs.Write(data,0,data.Length); 55 } 56 57 58 } 59 fs.Close(); 60 myClientSocket.Close(); 61 62 } 63 64 private static byte[] ReceiveVarData(Socket s) 65 { 66 int total = 0; 67 int recv; 68 byte[] datasize = new byte[4]; 69 recv = s.Receive(datasize, 0, 4, SocketFlags.None); 70 int size = BitConverter.ToInt32(datasize, 0); 71 int dataleft = size; 72 byte[] data = new byte[size]; 73 while (total < size) 74 { 75 recv = s.Receive(data, total, dataleft, SocketFlags.None); 76 if (recv == 0) 77 { 78 data = null; 79 break; 80 } 81 total += recv; 82 dataleft -= recv; 83 } 84 return data; 85 }