C#Socket文件传输(发送与接收代码)

2023-05-16

原文链接: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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#Socket文件传输(发送与接收代码) 的相关文章

  • TouchGFX使用心得(8)——通配符的中文显示(呕心沥血)

    这里写目录标题 前言方法一需要注意的问题 xff08 非常重要 xff01 xff01 xff01 xff01 xff09 方法二官方文档具体操作加载二进制文件通配符的显示放入stm32 总结 前言 通配符的中文的显示是我一直很疑惑的 xf
  • 9月10日美团网2014校招研发笔试哈尔滨站

    1 链表翻转 给出一个链表和一个数k xff0c 比如链表1 2 3 4 5 6 xff0c k 61 2 xff0c 则翻转后2 1 4 3 6 5 xff0c 若k 61 3 翻转后3 2 1 6 5 4 xff0c 若k 61 4 x
  • 2014校园招聘京东软件开发类笔试(完整版)

    时间 xff1a 2013 9 10 2013 10 8 地点 xff1a 四川大学 天津大学 职位 xff1a 软件开发工程师岗 语言 xff1a java 1 A 2 C 3 D 4 B 5 A 二 1 B 三1 D 2 B 3 C 4
  • 阅读科研文献心得分享(二)

    心得一 每天还保持读至少2 3篇的文献的习惯 读文献有不同的读法 但最重要的自己总结概括这篇文献到底说了什么 xff0c 否则就是白读 读的时候好像什么都明白 xff0c 一合上就什么都不知道 这是读文献的大忌 xff0c 既浪费时间 xf
  • 云数据库怎么挑选

    from http www chinacloud cn show aspx id 61 13222 amp cid 61 17 将数据库服务器在IaaS云上运行好吗 xff1f 或者应该转换成PaaS选择 xff1f 数据库即服务的选择可能
  • C# FTP操作(上传、下载等……)

    因为工作中经常涉及到FTP文件的上传和下载 xff0c 每次有这样的需求时都要重复编写相同的代码 xff0c 后来干脆整理一个FTPClass xff0c 这样不仅方便自己使用 xff0c 也可以共享给部门其它同事 xff0c 使用时直接调
  • 通过tasksel一键下载lamp(未成功)

    首先可以通过apt安装tasksel 安装 xff1a sudo apt install tasksel 通过taskel的方式安装lamp server全包 taskel的安装方式和apt get的有类似但是还是有区别个人觉得他像是apt
  • qemu创建快照后删除快照导致qemu crashed的BUG

    问题描述 启动一个虚拟机 创建三个快照 删除第一个快照时报错 合并磁盘失败 通过测试 创建虚拟机 ubuntu1604 win7 启动虚拟机 创建两个快照 删除第一个快照 瘦终端自自动关闭 vdsm报错如下 2018 07 20 17 00
  • 群晖docker容器内配置ubuntu远程桌面访问

    群晖docker容器内配置ubuntu远程桌面访问 当希望在群晖docker内的ubuntu开启远程桌面访问时 xff0c 和一般云服务器桌面安装方式还是有所区别 这里ubuntu的版本为14 04 LTS xff0c 由于nas性能较弱
  • Elasticsearch 7.6.0 最详细安装及配置(HA)安装与启动

    Elasticsearch 7 6 0 最详细安装及配置 xff08 HA xff09 安装与启动 Elasticsearch是一个非常好用的搜索引擎 xff0c 和Solr一样 xff0c 他们都是基于倒排索引的 今天我们就看一看Elas
  • python装饰器

    今天看了一些函数装饰器的知识 xff0c 第一遍没看懂 xff0c 后来才一点点弄明白 首先 xff0c 函数也是对象 xff0c 所以可以返回函数 def hello func func是函数名 def h xff1a 在函数内部的函数
  • 杀死XVNC进程

    0 重设密码 root 64 yqrh5u2 vncpasswd Password Verify root 64 yqrh5u2 1 xff0c 启动和kill vncserver root 64 yqrh5u2 vncserver 1 N
  • Winform布局与控件自适应分辨率以及防止错位

    我们在开发winform时 xff0c 在屏幕分辨率显示设置100 下开发系统界面 xff0c 但是有的同学的分辨率缩放设置是125 甚至 150 xff0c 这时候我们的系统界面默认就会错位 xff0c 导致效果体验极差 接下来我们来看效
  • 查询性能优化的十条建议

    三个原则 1 单行访问是很慢的 最好读取的块中能尽可能包含多的所需要的行 xff0c 使用索引可以创建位置引用以提升效率2 按顺序访问范围数据是很快的 lt 原因一 gt 顺序I O不需要多次磁盘寻道 xff0c 比随机I O要快很多 lt
  • Linux 使用npm安装pnpm成功后提示“-bash: pnpm: command not found“

    前提 xff1a 安装好nodejs xff0c 并且使用以下命令创建了软连接 xff08 报错也是由于这个原因 xff09 建立node软链接 ln s usr local nodejs bin node usr local bin 建立
  • android studio编译时提示error please select android sdk

    在做项目时协同开发时遇到的问题 更新工程后编译提示该错误 错误原因是 xff0c 有人上传了修改的 iml文件 xff0c 此处为app iml将 lt orderEntry type 61 34 jdk 34 jdkName 61 34
  • CPU主频频率越高,手机运行速度就越快吗?

    本文链接 xff1a https blog csdn net openkado article details 24087305 问 xff1a CPU频率越高 xff0c 手机速度就越快吗 xff1f 1 7GHz处理器的手机肯定比1 2
  • 多核编程与单核多线程编程

    并发 xff1a 时间段内有很多的线程或进程在执行 xff0c 但何时间点上都只有一个在执行 xff0c 多个线程或进程争抢时间片轮流执行 并行 xff1a 时间段和时间点上都有多个线程或进程在执行 单核cpu的话只能是并发 xff0c 多
  • 多线程与单核cpu,多核cpu概念

    1 多线程在单核和多核CPU上的执行效率问题的讨论 a1 多线程在单cpu中其实也是顺序执行的 xff0c 不过系统可以帮你切换那个执行而已 xff0c 其实并没有快 xff08 反而慢 xff09 多个cpu的话就可以在两个cpu中同时执
  • 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别

    当面临这些问题的时候 xff0c 有两个关键词无法绕开 xff0c 那就是并行和并发 首先 xff0c 要先了解几个概念 xff1a 1 进程是程序的一次执行 2 进程是资源分配的基本单位 3 一个进程可以包括多个线程 4 在单CPU计算机

随机推荐

  • 并行、并发,两者的区别

    并发和并行相似但又是两个不同的概念 xff0c 并行是指两个或者多个时间在同一时刻发生 xff0c 就好比如多个程序同时运行 而并发是指两个或者多个时间在同一时间间隔内发生 在多道程序环境下 xff0c 并发性是指在一段时间内宏观上有多个程
  • Ubuntu VNC安装与遇到的问题

    Linux下VNC server可选的很多 xff0c vnc4server tightvnc xff0c 我更喜欢tigervnc unity桌面环境在vnc中不能正常使用 xff0c 我翻遍互联网还是没找到很好的解决办法 xff0c 退
  • CPU的主频,总线频率和L2缓存对电脑的性能有哪些影响

    CPU是Central Processing Unit的缩写 xff0c 即中央处理器 CPU发展至今 xff0c 其中所集成的电子元件也越来越多 xff0c 上万个晶体管构成了CPU的内部结构 那么这上百万个晶体管是如何工作的呢 xff1
  • 寄存器(cpu工作原理)

    来源 xff1a 王爽老师的 汇编语言 1 一个典型的CPU由运算器 控制器 寄存器等器件组成 xff0c 这些器件靠内部总线相连 区别 xff1a 内部总线实现CPU内部各个器件之间的联系 外部总线实现CPU和主板上其它器件的联系 808
  • 寄存器、存储器、内存的区别

    从范围来看 xff0c 它们所指的范畴不一样 寄存器是中央处理器内的组成部份 它跟CPU有关 寄存器是有限存贮容量的高速存贮部件 xff0c 它们可用来暂存指令 数据和位址 在中央处理器的控制部件中 xff0c 包含的寄存器有指令寄存器 I
  • 寄存器(CPU的工作原理)

    通用寄存器 8086CPU有14个寄存器 xff0c 他们的名字称为诶 xff1a AX BX CX DX SI DI SP BP IP CS SS DS ES PSW 8086CPU所有的寄存器都是16位的 xff0c 可以存放两个字节
  • CPU,寄存器,内存三者的关系

    一 皇帝身边的小太监 寄存器 不知道什么是寄存器 xff1f 那见过太监没有 xff1f 没有 xff1f 其实我也没有 没见过不要紧 xff0c 见过就麻烦大了 xff0c 大家都看过古装戏 xff0c 那些皇帝们要阅读奏章的时候 xff
  • 内网和外网通信的问题

    各位大神 xff0c 我把两台电脑 xff0c 其中一台通过路由器映射了 xff0c 也就成为了所为的服务器了 xff0c 另一台也就是处在内网的 xff0c 也就是我们平时一般人的电脑 xff0c 也就是客户端了 xff0c 那么客户端是
  • OpenCV进行图像相似度对比的几种办法

    转载请注明出处 xff1a http blog csdn net wangyaninglm article details 43853435 xff0c 来自 xff1a shiter编写程序的艺术 对计算图像相似度的方法 xff0c 本文
  • Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后 xff0c 真心感觉python的功能实在太强大 xff0c 因此将这些文章总结一下 xff0c 建立一下自己的知识体系 当然了 xff0c 图像识别这个话题作为计算机科学的一个分支 xff0c
  • OpenCV进行图像相似度对比的几种办法

    1 直方图方法 方法描述 xff1a 有两幅图像patch 当然也可是整幅图像 xff0c 分别计算两幅图像的直方图 xff0c 并将直方图进行归一化 xff0c 然后按照某种距离度量的标准进行相似度的测量 方法的思想 xff1a 基于简单
  • 比较两幅图像的相似度

    现在以图搜图的功能比较火热 xff0c 很好奇其原理 简单的搜索学习得知 xff0c 实现相似图片搜索的关键技术是 感知哈希算法 xff0c 作用是对每一张图片按照某种规律生成一个对应的指纹字符串 比较不同图片之间的指纹字符串 xff0c
  • 查找文献方法整理

    1 dblp computer science bibliography 在搜索框查找文献关键字 xff0c 或文献标题 xff0c 右边可以筛选 找到想找的论文之后 xff0c 可以将鼠标移到view xff0c 找到原网站 有些网站可以
  • OpenCV进行图像相似度对比的几种办法

    平均哈希算法 实现步骤 缩小尺寸 xff1a 将图像缩小到8 8的尺寸 xff0c 总共64个像素 这一步的作用是去除图像的细节 xff0c 只保留结构 明暗等基本信息 xff0c 摒弃不同尺寸 比例带来的图像差异 xff1b 简化色彩 x
  • opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记 xff08 六 xff09 直方图比较图片相似度 opencv提供了API来比较图片的相似程度 xff0c 使我们很简单的就能对2个图片进行比较 xff0c 这就是直方图的比较 xff0c 直方图英文是histogra
  • 完整opencv(emgucv)人脸、检测、采集、识别、匹配、对比

    成对几何直方图匹配 public static string MatchHist string haarXmlPath 61 64 34 haarcascade frontalface alt tree xml 34 HaarCascade
  • OpenCV学习笔记——判断两张图的相似度

    判断两张图的相似度 方法 直方图对比法ORB算法 实验 1 直方图对比法 参考如何使用OpenCV3直方图方法进行人脸相似度对比 因为我的环境是VS2010 43 OpenCV2 4 8 xff0c 所以在原版的基础上做了一点小修改 inc
  • 【OpenCV】直方图应用:直方图均衡化,直方图匹配,对比直方图

    本文链接 xff1a https blog csdn net xiaowei cqu article details 7606607 前面介绍了 数字图像灰度直方图 xff0c 现在来尝试直方图的应用 直方图均衡化 直方图均衡化 xff08
  • C# Socket服务器及多客户端连接应用例程

    服务端代码 控制台示例 static List lt Socket gt Sockets 61 new List lt Socket gt static void Main string args int port 61 10 byte b
  • C#Socket文件传输(发送与接收代码)

    原文链接 xff1a http www cnblogs com reynoldchan p 3762014 html 这里是发送的代码 xff1a SendVarData是转码后发送函数 1 lt summary gt 2 发送文件 3 l