原文链接: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文件传输(发送与接收代码)相关推荐

  1. Java基于Socket文件传输示例

    这个实例中的socket文件传输采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出流进行包装,加快传输的速度. 先来看服务器端的程序. 1.服务器端 import java.io.Buffere ...

  2. Androidpcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住说话的demo

    pcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住播放的demo 效果:   -------------- 代码: MainActivity ...

  3. 【Linux系统与网络编程】16:Socket文件传输2

    Socket文件传输2 OVERVIEW Socket文件传输2 在socket文件传输1中使用了一种在buff缓冲数组后添加\0的方式实现文件的传输. 实现方法2:根据TCP在数据传输过程中进行粘包 ...

  4. socket文件传输服务器,Socket文件传输(含服务端以及客户端源码)

    Socket文件传输 [实例简介] 传输任意格式文件 [实例截图] [核心代码] using System; using System.Collections.Generic; using Syste ...

  5. 【Linux系统与网络编程】15:Socket文件传输1

    Socket文件传输1 在socket多线程实现多客户端连接服务器进行聊天的基础上,添加文件传输功能. fix1 在server.c中添加file_info结构体,用于单独接受某次客户端发送的file ...

  6. 51单片机串口通信发送以及接收代码详解1

    #include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...

  7. 51单片机串口通信发送以及接收代码详解2

    #include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...

  8. c语言socket发送excel,socket文件传输功能的实现

    服务端: #include #include #pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll #define BUF_SI ...

  9. Java基于Socket文件传输示例(转)

    最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...

最新文章

  1. TaskExecutor设计与实现
  2. HashMap的遍历
  3. 在Python中操纵json数据的最佳方式
  4. Flutter起步之安装
  5. 20151212Jquery 工具函数代码备份
  6. 电子元件-发光二极管
  7. maven-resources-plugin:2.6:resources (default-resources)
  8. 隐藏在计算机软硬件,隐匿在计算机软硬件背后的语言
  9. 从头开始设计我的网游
  10. 微软C/C++编译器选项
  11. 【IOT】Thingsboard学习笔记(1):开源IOT平台thingsboard部署-windows平台
  12. 杭电1874畅通工程绪
  13. 人体姿态估计-Human Pose Estimation (2021)
  14. 工作的意义,人生的意义,自由、快乐与幻觉
  15. 思维导图Vue2组件
  16. Ubuntu上编译安装迅雷XwareDesktop
  17. 解救人质的android游戏,一枪制敌解救人质游戏
  18. 学习《Linux就该这么学》第十一课
  19. ffmpeg和免费的录屏软件
  20. Beyond Compare 4.2.9破解

热门文章

  1. if else语句_你敢信?if语句执行完,竟然也会执行else语句
  2. 测试私有方法_Java基础之抽象类、接口作为方法参数和返回值
  3. 服务器虚拟化的毕业设计,基于Vmware的服务器虚拟化管理毕业论文.doc
  4. python全排列_全排列算法python实现
  5. lambda表达式python啥意思_Python中lambda表达式是什么
  6. 行星齿轮设计_精密行星减速机的作用、分类及应用领域和特点
  7. c++ 返回数组中最大的值_4个代码块教您如何在C中动态分配2D数组
  8. iphone7配置_西安苹果售后维修教您iphone7发热严重、耗电快怎么解决?
  9. 如何掌握“所有”的程序语言?没错,就是所有!
  10. 关于利用IBERT核对GTX收发器板级测试的原理与过程详解