【问题标题】:TCP socket programming, strange behavior when read dataTCP套接字编程,读取数据时的奇怪行为
【发布时间】:2015-04-24 14:31:15
【问题描述】:


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

【问题讨论】:

  • 您是否在第二次读取之前清除 bytesFrom?我怀疑你的缓冲区 bytesFrom 中有旧数据!
  • 您确定服务器在第一次读取时看到的是完整的“999999999”吗?

标签: c# sockets stream tcpclient


【解决方案1】:

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

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

请注意,我也将第三个参数更改为 networkStream.Read - 否则,如果数组中的数据多于您的空间,您将收到异常。 (如果你真的想使用ReceiveBufferSize,那么创建该长度的数组。)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2010-10-14
    • 2021-05-22
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多