【发布时间】:2012-01-26 10:30:57
【问题描述】:
我正在尝试使用 C# (.NET) 进行 Socket 编程。我参考了 codeproject 中的几个示例,但我的文件传输总是发送不完整的数据。
非常非常小的数据可以正常工作,例如 1kB。但较大的文件传输不完整,尤其是图像。
这是我的客户端代码,它将文件发送到服务器。 clientData 存储文件的二进制文件。
byte[] fileData = File.ReadAllBytes(filePath + fileName);
byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fileNameByte.Length);
curMsg = "Connection to server ...";
clientSock.Connect(ipEnd);
int count;
curMsg = "File sending...";
count = clientSock.Send(clientData);
MessageBox.Show(count+" "+clientData.Length);
curMsg = "Disconnecting...";
clientSock.Close();
虽然这是我用于接收文件的服务器的代码。
sock.Listen(100);
curMsg = "Running and waiting to receive file.";
Socket clientSock = sock.Accept();
byte[] clientData = new byte[1024 * 5000];
int receivedBytesLen = clientSock.Receive(clientData);
curMsg = "Receiving data...";
int fileNameLen = BitConverter.ToInt32(clientData, 0);
string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath +"/"+ fileName, FileMode.Append)); ;
bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
curMsg = "Saving file...";
bWrite.Close();
clientSock.Close();
有趣的是,当我在客户端的“发送”处设置断点时,文件可以正常传输。当我使用断点时,我正在观察两端的字节数和传输字节匹配,而当我不使用断点时,接收到的字节低于客户端传输的字节。
我做错了什么?
【问题讨论】:
-
可以上传你写的分块发送数据的代码吗?
-
您正在使用的 Close() 的重载不会等待发送/接收“完成”,您必须使用具有超时的重载,以便它有时间“清除”您的传出流。
标签: c# .net sockets tcpclient file-transfer