gpt4 book ai didi

c# - TCP 传输文件在服务器和客户端在 1 台 PC 上运行时有效,但在 2 台 PC 上运行时损坏

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

所以我正在尝试制作一个程序,该程序将我想从我的主 PC 中的客户端打印的文件发送到我的第二台运行服务器并连接到打印机的 PC。当我测试我的代码时,我在我的主电脑上运行了客户端和服务器,并且运行良好。但是,当我在我的主 PC 上运行客户端并在我的第二台 PC 上运行服务器时,文件已损坏,我不确定为什么。

这是我的Listener(我删除了我认为不需要的部分):

void Listener()
{
//All of these strings and bools are filled correctly I just removed it because its long
string file="";
string size = "";
bool print;

Socket server = myList.AcceptSocket();

var output = File.Create(file);
Console.WriteLine("Client connected. Starting to receive the file");

int k = 0;
int read = 0;
byte[] buffer = new byte[long.Parse(size)];
NetworkStream stm = new NetworkStream(server);

while ((k = stm.Read(buffer, 0, buffer.Length-read)) > 0)
{
read += k;
}
output.Write(buffer, 0, buffer.Length);

output.Close();
if (print) { PrintFile(file); }
server.Close();
Thread.CurrentThread.Abort();
}

这是客户端代码(我删除了我认为不需要的部分):

void startClient()
{
FileInfo f = new FileInfo(file);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(IPAddress.Parse("10.0.0.13"), 27015);
Console.WriteLine("Connected");
byte[] bytes = File.ReadAllBytes(file);
client.SendFile(file);
Console.WriteLine("File Sent");
client.Close();
}

有人知道怎么解决吗?提前致谢!

最佳答案

您没有将 read 偏移应用到缓冲区,而是在每次 NetworkStream.Read() 调用时从索引 0 开始写入。在本地,或者在测试较小的文件时,这会很好地工作,因为所有内容都会在一个 Read() 中到达。在真实的网络上或处理较大的文件时,您会发现需要多次调用 Read() 来读取所有数据。

所以改成:

stm.Read(buffer, read, buffer.Length-read)

您可能还需要重新考虑一次读取内存中的整个文件。您可能希望同时将其写入磁盘,尤其是因为分配大型数组可能会比您预期的更早导致 OutOfMemoryException

还可以考虑使用现有的网络协议(protocol),而不是自行开发。除了这个非常基本的问题之外,您还容易遇到许多其他常见的套接字陷阱。

关于c# - TCP 传输文件在服务器和客户端在 1 台 PC 上运行时有效,但在 2 台 PC 上运行时损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32821559/

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