C#Socket文件传输(发送与接收代码)
2023-09-11 14:16:45 时间
原文链接:http://www.cnblogs.com/reynoldchan/p/3762014.html
这里是发送的代码:
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 }
转载于:https://www.cnblogs.com/reynoldchan/p/3762014.html
相关文章
- C#6.0,C#7.0新特性
- default 关键字泛型代码中的默认关键字(C# 编程指南)
- C#签名算法HS256和RS256实战演练
- C#隐藏手机号中间四位为*
- C#通过XML导出Excel
- 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用
- 密码学系列——数字签名(c# 代码实操)
- C#调用EasyPusher推送到EasyDarwin流媒体服务器直播方案及示例代码整理
- c# 优化代码的一些规则——用委托表示回调[五]
- C# DataTable中返回列中的最大值
- C# 强制删除文件,解除占用的几点思考
- C# WinForm中 让控件全屏显示的实现代码
- C# 下载带进度条代码(普通进度条)
- C# 判断字符串是否可以转化为数字
- C# 加密小工具代码实现
- Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle
- C# 不安全代码
- C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字
- C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword)
- [C#]c#中数据的同步加锁机制 的几种方法
- C#中安卓程序员写的App的代码在哪
- C#中的运算符和异常处理