TCP客户端到服务器会破坏数据

时间:2015-08-13 05:05:22

标签: c# tcp

这很奇怪。

使用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而不是!应用程序发送通过此甚至运行,图片显示错误,等等。

但是,我想注意一下,客户端 - >服务器失败,另一方面,服务器 - >客户工作。奇怪。

顺便说一句,如果您感兴趣,这是用于发送文件...另外,使用.NET 4.5。此外,我的网络非常可靠。

1 个答案:

答案 0 :(得分:1)

您好我认为您对TCP存在一些误解。 我可以看到你正在设置一个服务器,其接收缓冲区为x字节。 首先让你检查一下这是多少字节?我怀疑它是非常小的东西,如1024或其他东西。 通过TCP写入数据时,数据被分成帧。每次收到您都会收到一些数据,它会告诉您有多少数据received 。从我的用例中可以看出,您不知道要接收的数据大小,因此您必须在客户端和服务器之间建立协议以进行通信。最简单的方法是写一个4字节的整数,指定要接收的数据大小。 沟通就是这样的。

客户端:

  1. 写入4个字节(文件大小)
  2. 写入数据字节
  3. 服务器:

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