C#Socket文件传输(发送与接收代码)
原文链接: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#Socket文件传输(发送与接收代码)相关推荐
- Java基于Socket文件传输示例
这个实例中的socket文件传输采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出流进行包装,加快传输的速度. 先来看服务器端的程序. 1.服务器端 import java.io.Buffere ...
- Androidpcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住说话的demo
pcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住播放的demo 效果: -------------- 代码: MainActivity ...
- 【Linux系统与网络编程】16:Socket文件传输2
Socket文件传输2 OVERVIEW Socket文件传输2 在socket文件传输1中使用了一种在buff缓冲数组后添加\0的方式实现文件的传输. 实现方法2:根据TCP在数据传输过程中进行粘包 ...
- socket文件传输服务器,Socket文件传输(含服务端以及客户端源码)
Socket文件传输 [实例简介] 传输任意格式文件 [实例截图] [核心代码] using System; using System.Collections.Generic; using Syste ...
- 【Linux系统与网络编程】15:Socket文件传输1
Socket文件传输1 在socket多线程实现多客户端连接服务器进行聊天的基础上,添加文件传输功能. fix1 在server.c中添加file_info结构体,用于单独接受某次客户端发送的file ...
- 51单片机串口通信发送以及接收代码详解1
#include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...
- 51单片机串口通信发送以及接收代码详解2
#include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...
- c语言socket发送excel,socket文件传输功能的实现
服务端: #include #include #pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll #define BUF_SI ...
- Java基于Socket文件传输示例(转)
最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...
最新文章
- TaskExecutor设计与实现
- HashMap的遍历
- 在Python中操纵json数据的最佳方式
- Flutter起步之安装
- 20151212Jquery 工具函数代码备份
- 电子元件-发光二极管
- maven-resources-plugin:2.6:resources (default-resources)
- 隐藏在计算机软硬件,隐匿在计算机软硬件背后的语言
- 从头开始设计我的网游
- 微软C/C++编译器选项
- 【IOT】Thingsboard学习笔记(1):开源IOT平台thingsboard部署-windows平台
- 杭电1874畅通工程绪
- 人体姿态估计-Human Pose Estimation (2021)
- 工作的意义,人生的意义,自由、快乐与幻觉
- 思维导图Vue2组件
- Ubuntu上编译安装迅雷XwareDesktop
- 解救人质的android游戏,一枪制敌解救人质游戏
- 学习《Linux就该这么学》第十一课
- ffmpeg和免费的录屏软件
- Beyond Compare 4.2.9破解
热门文章
- if else语句_你敢信?if语句执行完,竟然也会执行else语句
- 测试私有方法_Java基础之抽象类、接口作为方法参数和返回值
- 服务器虚拟化的毕业设计,基于Vmware的服务器虚拟化管理毕业论文.doc
- python全排列_全排列算法python实现
- lambda表达式python啥意思_Python中lambda表达式是什么
- 行星齿轮设计_精密行星减速机的作用、分类及应用领域和特点
- c++ 返回数组中最大的值_4个代码块教您如何在C中动态分配2D数组
- iphone7配置_西安苹果售后维修教您iphone7发热严重、耗电快怎么解决?
- 如何掌握“所有”的程序语言?没错,就是所有!
- 关于利用IBERT核对GTX收发器板级测试的原理与过程详解