tcpclient缓冲区大小异常



我正在使用简单的TCP客户端应用将请求发送到服务器。这是将客户端消息发送到服务器的客户端代码。服务器发送响应,但有时响应是一个空字符串。

发生时,我抓住了一个断点,发现当我将鼠标放在client.ReceiveBufferSize上时,它显示了异常ObjectDisposedException

这是代码:

private string SendClientMsg(string textToSend, string handID)
{ 
    TcpClient client = new TcpClient(serverIP, port);
    NetworkStream nwStream = client.GetStream();
    //---create a TCPClient object at the IP and port no.---
    byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(textToSend);
    //---send the text---
    nwStream.Write(bytesToSend, 0, bytesToSend.Length);
    //---read back the text---
    byte[] bytesToRead = new byte[client.ReceiveBufferSize];
    int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
    string response = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);
    client.Close();
    return response;
    }
 }

此方法属于类。多个线程使用此方法将请求发送到服务器。可能是一个线程打开连接并开始发送但与此同时,另一个线程使用client.Close()

关闭连接

我不确定所有线程是否共享相同的TCPCLIENT对象。(这是单身对象,因此所有线程都共享吗?(。如果是这样,我将不得不锁定以确保多个线程无法同时访问此方法。

每当此方法称为新实例TcpClient时:

TcpClient client = new TcpClient(serverIP, port);

只有调用线程可以访问此实例,因此这不是问题。

问题是您假设您将收到整个
单个读物中的响应:

int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);

来自msdn:

字节的总数读取到缓冲区中。如果目前尚不可用的字节,则可能小于所请求的字节数,或者如果达到流的末尾,则零(0(。

服务器响应需要时间,并且需要时间才能进行响应
通过网络发送。当您致电Read时,整个响应可以或可能还可能不可用,因此您需要在循环中阅读,直到到达流的结尾。

var responseBuffer = new byte[client.ReceiveBufferSize];
var bytesRead = 0;
int read;
do
{
   read = nwStream.Read(responseBuffer, 0, client.ReceiveBufferSize);
} while (read > 0)

这是假设服务器处理请求后正确关闭连接。
如果连接保持打开要确定您已经收到了对请求的全部答复。

相关内容

最新更新