2015-02-23 29 views
1


我正在写tcp套接字程序。
当我发送字符串,比以前发送,从客户端收到并在服务器上接收它,发生了一些奇怪的事情。例如:
首先我发送'999999999'。服务器收到良好。
之后,我发送较短的字符串:'7777777'。但服务器上的数据是'777777799'TCP套接字编程,读数据时奇怪的行为

为什么之前的数据剩余量在下次发送时仍然存在?

我的代码如下:

// 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

你是否在第二次读取之前清除bytesFrom?我怀疑你的缓冲区bytesFrom里面有旧数据! – Adil 2015-02-23 09:52:51

+0

您确定服务器在第一次阅读时看到完整的“999999999”吗? – 2015-02-23 09:53:59

回答

1

你忽略的数据量你读过,而不是总是整个字节数组转换成一个字符串,其中包括仍然存在的任何数据先前的读取(或初始字节数组元素)。你应该有:

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

请注意,我已经改变了第三个参数networkStream.Read,太 - 否则,如果有更多的数据比你有空间数组中,你会得到一个异常。 (如果你真的想使用ReceiveBufferSize,那么创建该阵列的长度。)

此外,你应该检查bytesRead是积极的 - 否则,如果连接关闭,你会得到一个异常。

基本上,你应该差不多从来没有忽略Stream.Read的返回值。