TCP套接字编程,读取数据时的奇怪行为

时间:2015-02-23 09:50:08

标签: c# sockets stream tcpclient


我正在编写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();
}

1 个答案:

答案 0 :(得分:1)

您忽略了您已读取的数据量,而是始终将整个字节数组转换为字符串,包括先前读取(或初始字节)中仍然存在的任何数据数组元素)。你应该:

int bytesRead = networkStream.Read(bytesFrom, 0, bytesFrom.Length);
dataFromClient = Encoding.ASCII.GetString(bytesFrom. 0, bytesRead);

请注意,我已将第三个参数更改为networkStream.Read - 否则,如果数据中的数据多于数组中的空间,则会出现异常。 (如果您确实想使用ReceiveBufferSize,则为该长度创建数组。)

此外,您应检查bytesRead是否为正 - 否则,如果连接已关闭,您将收到异常。

基本上,您应该永远不会忽略Stream.Read的返回值。