我正在尝试实现一个tcp客户端侦听功能。这意味着,在与服务器建立连接后,此tcp客户端只是停留在那里,等待新数据的到达。这是我的代码,但当它运行时,它会抱怨无法从网络流中读取任何内容。但是服务器还没有开始发送数据。我猜是因为tcp客户端超时引起的。
这是正确的做法吗?
public void listen(dataHandler processDataFuc)
{
NetworkStream stream;
Byte[] data_buffer = new Byte[MAX_PACKET_SIZE];
if(!this.Connected)
{
this.Connect();
}
while (!this.terminate_listening)
{
stream = main_client.GetStream();
while (stream.Read(data_buffer, 0, data_buffer.Length) > 0)
{
processDataFuc(data_buffer);
}
}
}谢谢
发布于 2009-11-06 08:38:44
简而言之,答案是肯定的,它会做你想做的事情,但它并不理想。我首先建议将stream = main_client.GetStream();移出while循环,因为您只是一遍又一遍地得到相同的流。此外,如果您希望在很长一段时间内获得断断续续的数据,那么使用NetworkStream.Read也不是执行连续读取的最佳方式,因为它只为一个任务占用了一个线程;最好使用BeginRead并传入一个回调,该回调将立即返回,但当数据可用时(通过回调)会发出警报。
发布于 2011-12-26 17:46:04
查看方法EstablishConnection()和IncomingDataSyncWorker() (同步)或IncomingPacketHandler() (异步),了解您想要做什么的示例。所有这些方法都是开源网络通信库networkComms.net的一部分。
发布于 2012-12-06 16:44:20
您使用的是什么版本的.Net?
如果您使用的是.Net 4.0或4.5,则可以使用ReadAsync()而不是Read()。
请考虑以下内容:
public async void listen(dataHandler processDataFuc)
{
NetworkStream stream;
Byte[] data_buffer = new Byte[MAX_PACKET_SIZE];
if(!this.Connected)
this.Connect();
stream = main_client.GetStream();
while (!this.terminate_listening)
{
await stream.ReadAsync(data_buffer, 0, data_buffer.Length)
processDataFuc(data_buffer);
}
} 这样,ReadAsync()将在一个单独的线程中等待,直到服务器发送一些数据。然后,您的其余代码将会执行。
https://stackoverflow.com/questions/1684232
复制相似问题