我正在使用简单的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)
这是假设服务器处理请求后正确关闭连接。
如果连接保持打开要确定您已经收到了对请求的全部答复。