0

我有一个服务器和多个通过 TCP 套接字连接的客户端。服务器侦听连接的客户端,这些客户端首先使用其唯一的设备 ID 注册自己。当设备首次注册时,服务器会向客户端发送一条小消息。这会唤醒客户端从另一个来源下载数据。

我们遇到的问题是网络使用 GPRS,而且在覆盖范围较差的地区,网络经常出现故障或服务质量很差。似乎正在发生的是,在客户端内部,即使网络层下降,NetworkStream.Read() 调用也会阻塞。没有抛出异常,即使网络返回,调用似乎也没有检测到任何数据。

这有什么原因吗?我该如何解决这个问题?

我原以为 NetworkStream 至少会引发异常,以便客户端可以进入重试连接阶段。

4

2 回答 2

0

您需要的是读取超时。在某些情况下,即使对等方未运行,TCP 读取也可能永远阻塞。

于 2012-09-04T10:01:05.137 回答
0

NetworkStream 不检测一个客户端和另一个客户端之间的连接。它只是监听数据。Read() 阻塞线程直到它接收到数据。

相反,请考虑使用BeginRead(或.Net 4.5 中的ReadAsync)。它不会阻塞线程,并且在没有新数据的超时后,您可以关闭套接字,创建一个新的并重新开始。

于 2012-09-04T08:07:46.807 回答