我正在编写tcp套接字程序
当我发送字符串,比以前的发送短,从客户端并在服务器上接收它时,发生了一些奇怪的事情。例如:
首先,我发送' 999999999' 。服务器接收得很好
之后,我发送较短的字符串:' 7777777' 。但服务器上的数据是' 777777799' 。
为什么先前数据的残余在下次发送时仍然存在?
我的代码如下:
// Section: client sending data ----
NetworkStream serverStream = clientSocket.GetStream();
byte[] outStream = Encoding.ASCII.GetBytes("999999999");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
// Section: Server reading data ----
while ((true))
{
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = Encoding.ASCII.GetString(bytesFrom);
networkStream.Flush();
}
答案 0 :(得分:1)
您忽略了您已读取的数据量,而是始终将整个字节数组转换为字符串,包括先前读取(或初始字节)中仍然存在的任何数据数组元素)。你应该:
int bytesRead = networkStream.Read(bytesFrom, 0, bytesFrom.Length);
dataFromClient = Encoding.ASCII.GetString(bytesFrom. 0, bytesRead);
请注意,我已将第三个参数更改为networkStream.Read
- 否则,如果数据中的数据多于数组中的空间,则会出现异常。 (如果您确实想使用ReceiveBufferSize
,则为该长度创建数组。)
此外,您应检查bytesRead
是否为正 - 否则,如果连接已关闭,您将收到异常。
基本上,您应该永远不会忽略Stream.Read
的返回值。