我需要一些帮助。我有一个使用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);
}
我做了以下事情: - 验证服务器确实正在正确发送字节数组。
我不知道我在这里做错了什么。或者我的代码中是否有错误。
答案 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;
}