TCPClient - 数据不匹配

时间:2013-09-16 04:14:45

标签: c# tcpclient

我需要一些帮助。我有一个使用C#TCPClient的简单服务器客户端应用程序

我遇到的问题是当客户端向服务器发送消息时,服务器返回一个包含数字的4字节响应。

但是,每3或4个响应的字节都在同一错误的位置。

例如:

服务器响应,字节数组包含整数243:

byte[0] => 243 byte[1] => 0 byte[2] => 0 byte[3] => 0

客户端收到如下4个字节:

byte[0] => 0 byte[1] => 0 byte[2] => 243 byte[3] => 0

这是一个整数15925248而不是243。

这是服务器代码的片段。代码在客户端发送消息时执行:

byte[4] resp = new byte[4];
Buffer.BlockCopy(BitConverter.GetBytes(243), 0, resp, 0, 4);
clientStream.Write(resp, 0, resp.Length);
clientStream.Flush();

以下是要接收的客户端代码片段:

Byte[] rec = new Byte[4] {0xx0, 0x00, 0x00, 0x00};
if (netStream.CanRead)
{
int numberOfBytesRead = 0;
do
{
numberOfBytesRead = netStream.Read(rec, 0, rec.Length);
} while (netStream.DataAvailable);
}

我做了以下事情: - 验证服务器确实正在正确发送字节数组。

我不知道我在这里做错了什么。或者我的代码中是否有错误。

1 个答案:

答案 0 :(得分:1)

您检索numberOfBytesRead,但不检查它是否实际收到了所有四个字节。例如,如果第一个接收的数据是3个字节,则将从流中的连续Read读取下一个字节,“移位”数据。

您可以通过将代码更改为以下内容来解决此问题:

byte[] rec = new byte[4];
int index = 0;
int remainingBytes = rec.Length;
while (remainingBytes > 0)
{
    int read = netStream.Read(rec, index, remainingBytes);
    if (read == 0) return DisconnectedBeforeReceiving4Bytes();
    remainingBytes -= read;
    index += read;
}