gpt4 book ai didi

c# - 套接字文件传输在 C# 中发送不完整的文件

转载 作者:行者123 更新时间:2023-12-03 11:58:33 24 4
gpt4 key购买 nike

我正在尝试使用 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();

有趣的是,当我在客户端的“发送”处设置断点时,文件传输正常。当我使用断点时,我正在观察两端的字节数和传输字节匹配,而当我不使用断点时,接收到的字节低于客户端传输的字节。

我究竟做错了什么?

最佳答案

你忘了实现一个协议(protocol)!要使用 TCP,您必须设计和实现一个协议(protocol),该协议(protocol)定义将发送哪些字节以及接收方如何识别消息或协议(protocol)数据元素。你什么都没做。您的接收代码无法知道它是否已接收到整个文件,因为没有协议(protocol)可以告诉它,也没有任何代码可以实现这样的协议(protocol)。所以它当然会出错——它没有办法让它正确。

如果 receivedBytesLen是 1,您的代码严重失败。

关于c# - 套接字文件传输在 C# 中发送不完整的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9016793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com