我正在尝试实现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);
}
}
}
由于
答案 0 :(得分:1)
简短的回答是肯定的,它会做你想要的,但它并不理想。我首先建议将stream = main_client.GetStream();
移出while
循环,因为您只是一遍又一遍地获取相同的流。另外,如果你期望在很长一段时间内出现间歇性数据,那么使用NetworkStream.Read
并不是执行连续读取的最佳方法,因为它只是为这一项任务提供了一个线程;最好使用BeginRead
并传入回调,回调会立即返回,但稍后会在数据可用时提醒您(通过回调)。
答案 1 :(得分:0)
检查方法EstablishConnection()和IncomingDataSyncWorker()(同步)或IncomingPacketHandler()(异步)以获取您要执行的操作的示例。所有这些方法都是networkComms.net开源网络通信库的一部分。
答案 2 :(得分:0)
您使用的是什么版本的.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()
将在单独的线程中等待,直到服务器发送一些数据。然后其余的代码将执行。