在我的程序中我正在创建套接字并且客户端连接我正在创建新线程并尝试读取和写入连接到此套接字,但总是得到读取错误,因为主机 - 计算机关闭连接的第二个命令,来自客户端worfs的第一个命令很好,第三个工作正常。我尝试检查clientSocket是否已连接,以及networkStream是否可读,并且它们总是返回true。我怎么能解决这个问题?它怎么可能 - networkStream.CanRead返回true但networkStreamRead引发错误?我是C#和套接字编程的新手,对于愚蠢的问题感到抱歉。
clientSocket
是TcpClient
networkStream
是NetworkStream
if (clientSocket.Connected == true)
{
requestCount = requestCount + 1;
networkStream = clientSocket.GetStream();
if (networkStream.CanRead == true)
{
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
}
}
答案 0 :(得分:3)
NetworkStream.CanRead
属性仅表示流支持读取,并不意味着数据可用。从网络读取时,您始终必须继续读取,直到整个帧完成,其中帧的含义完全取决于协议:它可能意味着前导码大小标头,终结器(如\ 0x0A)或特殊序列(如单个点)在一条线上。虽然框架不完整,但您必须继续发布接收缓冲区,或者如果使用流API则从流中读取。
第二个问题是,您显然必须限制自己仅解释您收到的字节,而不是整个发布的缓冲区。 NetworkStream.Read
返回到目前为止可用的实际字节数,缓冲区中的任何内容都是垃圾:
networkStream = clientSocket.GetStream();
int bytesReceived = networkStream.Read(
bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(
bytesFrom, 0, bytesReceived);
这仍然无法正确处理帧分隔符,因为您不知道dataFromClient
是否全部来自客户端的数据,但这完全取决于协议。