gpt4 book ai didi

c# - TCP 文件传输 - 几个字节错误

转载 作者:可可西里 更新时间:2023-11-01 02:52:01 26 4
gpt4 key购买 nike

我目前正在开发一个 C# 程序,该程序允许用户通过网络发送文件并在另一端重新组合它。除了在目标位置错放了几个字节之外,它一切正常,使其成为与开始时不完全相同的文件。 (例如损坏图像)。编辑:至少当它在我的电脑上时,我注意到可以通过让客户端在开始从流中读取之前等待一秒钟来解决错误,这让我觉得客户端偶尔会到达流的末尾并读取别的东西代替。知道如何以更好的方式解决这个问题,而不是像其他计算机那样等待一秒钟,我不知道这是否可行。我的服务器的代码如下:

TcpListener listener = new TcpListener(13);
listener.Start();
FileStream inputStream = File.OpenRead(loadLocation.Text);//loadLocation being a text box with the file path
FileInfo f = new FileInfo(loadLocation.Text);
int size = unchecked((int)f.Length);//Get's the file size in Bytes
int csize = size / 4096;//Get's the size in chunks of 4kb;

statusLabel.Text = "Waiting for connection...";
TcpClient client = listener.AcceptTcpClient();
statusLabel.Text = "Connection accepted.";
NetworkStream ns = client.GetStream();
byte[] byteSize = BitConverter.GetBytes(size);//Sends the number of bytes to expect over the network
try
{
ns.Write(byteSize, 0, byteSize.Length);
byte[] temp = new byte[4096];
for (int i = 0; i < csize; i++)
{
inputStream.Read(temp, 0, 4096);
ns.Write(temp, 0, 4096);
}
byte[] end = new byte[size % 4096];
inputStream.Read(end, 0, size % 4096);
ns.Write(end, 0, size % 4096);
ns.Close();
inputStream.Close();
client.Close();
done = true;
statusLabel.Text = "DONE!";
}
catch (Exception a)
{
Console.WriteLine(a.ToString());
}
listener.Stop();

客户端代码如下:

try
{
FileStream outputStream = File.OpenWrite(saveLocation.Text);
TcpClient client = new TcpClient("127.0.0.1", 13);

NetworkStream ns = client.GetStream();

byte[] byteTime = new byte[sizeof(int)];
int bytesRead = ns.Read(byteTime, 0, sizeof(int));
int size;
size = BitConverter.ToInt32(byteTime, 0);
int csize = size / 4096;
byte[] temp = new byte[4096];
for (int i = 0; i < csize; i++)
{
ns.Read(temp, 0, 4096);
outputStream.Write(temp, 0, 4096);
}
byte[] end = new byte[size % 4096];
ns.Read(end, 0, size % 4096);
outputStream.Write(end, 0, size % 4096);
ns.Close();
outputStream.Close();
client.Close();
statusLabel.Text = "DONE!";

}
catch (Exception a)
{
Console.WriteLine(a.ToString());
}

我知道 TCP 保证传递顺序,因此我不知道可能导致输出文件问题的原因。另一个值得注意的部分是每次损坏都略有不同,例如在传输图像时,图像上的不同点会有一个大标记。

最佳答案

您的代码应该考虑到,NetworkStream(以及一般的大多数 TCP 套接字)不一定会返回最初请求的全部字节数。

微软 writes :

The Read operation reads as much data as is available, up to the number of bytes specified by the size parameter.

在您的读取操作周围添加一个外部循环,以确保实际填充缓冲区。一些更多的错误处理也是可取的。

或许,你可以从类似的question+answer中得到一些启发.它展示了这样一个外循环的样子。

关于c# - TCP 文件传输 - 几个字节错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23710443/

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