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 }

C#Socket文件传输(发送与接收代码),布布扣,bubuko.com

时间: 2024-10-26 15:00:10

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

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

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度.废话少说,先来看服务器端的程序. 1.服务器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream;

Java基于Socket文件传输示例

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度.废话少说,先来看服务器端的程序. 1.服务器端 package localSocket; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStrea

android--Java基于Socket文件传输示例

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度.废话少说,先来看服务器端的程序. 1.服务器端 package sterning;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.DataOutputStream;impo

android WIFI Socket 文件传输——问题已经解决了,发帖只因高兴--嘿嘿--并不彻底欢迎点评

本来是一个问题贴,最终因为太长了,只能搞成博客了.算是做个记录吧 </pre><pre name="code" class="java">我的这个Socket是想保持一个长连接,文件可以循环传输 但是我的问题在于,不能抓住文件传输完成的这个时机,导致异常 我的文件发送代码 [code=java] public void sendFile(String filePath) { try { File file = new File(filePat

socket文件传输功能的实现

服务端: #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll    #define BUF_SIZE 1024    int main(int argc, char *argv[]){     //先检查文件是否存在     char *filename = "Beyond.mp3";//文件名     FI

Socket 文件传输

服务端 1.控件:TServerSocket 2.OnClientRead事件处理 procedure TMainForm.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);varmsgr,theFileName:ansistring;bufRecv:Pointer;acc,iLength:Integer;begin acc:=0; //接收 0 1-不接受//接收到的数据的长度iLength:=Socket.ReceiveLengt

Java基础&mdash;socket编程&mdash;UDP发送及接收

简介:在同一主机上测试,同一IP地址,不同的端口,使用UDP发收数据 使用socket编程,通过UDP协议发送数据 需求:使用UDP协议向某IP的某端口发送一条数据 UdpSend.java package com.Train; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.ne

C++大文件传输

C/C++大文件/数据网络传输方法总结 在C/C++网络编程中不免会遇到需要传输大数据.大文件的情况,而由于socket本身缓冲区的限制,大概一次只能发送4K左右的数据,所以在传输大数据时客户端就需要进行分包,在目的地重新组包.而实际上已有一些消息/通讯中间件对此进行了封装,提供了直接发送大数据/文件的接口:除此之外,利用共享目录,ftp,ssh等系统命令来实现大文件/数据也不失为一种好的方法. 1.基础的基于socket进行传输 基础的基于socket进行传输关键在于控制,需要自己行分包和组包

基于tcp下的文件传输下载

1 //*****客户端****** 2 /*功能: (1) input>list 查看服务端目录内容 3 (2) input>get files 下载文件 4 (3) input>put file 上传文件*/ 5 6 #include <head.h> 7 8 #define UPLOAD_FILE 1 9 #define DOWNLOAD_FILE 2 10 #define FILE_YEXIST 3 11 #define FILE_NEXIST 4 12 #defin