TCP客户端到服务器损坏数据

本文关键字:损坏 数据 服务器 客户端 TCP | 更新日期: 2023-09-27 18:07:32

这太奇怪了。

当我用TCP客户端向TCP服务器发送数据时。它破坏数据,由于一些非常奇怪的,相当恼人的原因。

服务器代码:

TcpListener lis = new TcpListener(IPAddress.Any, 9380); // it needs to be 9380, crucial
lis.Start();
Socket sk = lis.AcceptSocket();
byte[] pd = new byte[sk.ReceiveBufferSize];
sk.Receive(pd);
// cd is the current directory, filename is the file, ex picture.png, 
// that was previously sent to the server with UDP.
File.WriteAllBytes(Path.Combine(cd, filename), pd); 
下面是客户端代码:
// disregard "filename" var, it was previously assigned in earlier code
byte[] p = File.ReadAllBytes(filename) 
TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse(getIP()), 9380);
Stream st = client.GetStream();
st.Write(p, 0, p.Length);

发生的是数据丢失。极端的情况是,有时我会上传一个5KB的文件,但当服务器接收并写入我发送的文件时,它会变得像2字节一样疯狂。或者改成8KB !通过此方式发送的应用程序甚至不会运行,图片显示错误等。

然而,我想指出的是,在这种情况下,client -> server失败了,另一方面,server -> client工作了。奇怪。

顺便说一句,如果你感兴趣的话,这是用来发送文件的…同样,使用。net 4.5。而且,我的网络非常可靠。

TCP客户端到服务器损坏数据

你好,我认为你对TCP有一些误解。我可以看到您正在使用x字节的接收缓冲区设置服务器。首先,您是否检查过它有多少字节?我怀疑它是非常小的,比如1024或什么的。当通过TCP写入数据时,数据被分成帧。每次接收时,你都会得到一些发送的数据,它会告诉你已经接收了多少数据。正如我从你的用例中看到的,你不知道要接收的数据的大小,所以你必须在客户端和服务器之间建立一个协议来进行通信。其中最简单的方法是写入一个4字节的整数,指定要接收的数据的大小。通信将是这样进行的。

客户:

  1. 写入4字节(文件大小)
  2. Write Data bytes

服务器:

  1. 读取4字节(文件大小)
  2. 虽然我们还没有收到文件大小读取/文件流