我用
然而,在某些情况下,客户端无法检测到与服务器的断开连接。我测试的最简单方法是拔掉 Wi-Fi 路由器上的网络电缆或将手机设置为飞行模式,但在本该是稳定的 Wi-Fi 上的游戏中也发生过这种情况。
通过查看
我尝试过:
我对保持活动状态没有问题(默认情况下,服务器将通知客户端它已经很久没有收到任何消息,而客户端将发送一个心跳信号),但是目前,根据
TcpClient
和 NetworkStream
创建了一个简单的持久套接字连接,用于我们的游戏。连接、发送消息和正常断开连接(退出应用程序/关闭服务器等)都没有问题。然而,在某些情况下,客户端无法检测到与服务器的断开连接。我测试的最简单方法是拔掉 Wi-Fi 路由器上的网络电缆或将手机设置为飞行模式,但在本该是稳定的 Wi-Fi 上的游戏中也发生过这种情况。
通过查看
NetworkStream
等文档,它说检测断开连接的唯一方法是尝试向套接字写入内容。很好,但是当我尝试时,写操作会像没有错误一样通过。我可以像这样写入多个消息,一切似乎都很好。只有在插回电缆后,它才会发现已经断开连接(所有消息都被缓冲?)。
TcpClient
设置为 NoDelay
,并且每次写入后都调用 Flush()
。我尝试过:
- 向
NetworkStream
写入消息-无效 CanWrite
、Connected
等均返回 trueTcpClient.Client.Poll( 1000, SelectMode.SelectWrite );
- 返回 trueTcpClient.Client.Poll( 1000, SelectMode.SelectRead ) && TcpClient.Client.Available == 0
- 返回 trueTcpClient.Client.Receive(buffer, SocketFlags.Peek) == 0
- 当连接时,阻塞约 10-20 秒,然后返回 true。当没有服务器时,永远阻塞(?)NetworkStream.Write()
- 不会抛出错误NetworkStream.BeginWrite()
- 不会抛出错误(即使调用EndWrite()
)- 设置
WriteTimeout
- 没有效果 - 有一个特定的时间,我们没有从服务器收到消息(通常有一个保持活动状态的消息)- 我曾经这样做过,但是将其删除了,因为由于延迟等原因,我们得到了很多误报(一些客户端会看到 10-20 秒的延迟)
NetworkStream
在向应该已断开的套接字写入内容时抛出错误(就像它应该做的那样)?我对保持活动状态没有问题(默认情况下,服务器将通知客户端它已经很久没有收到任何消息,而客户端将发送一个心跳信号),但是目前,根据
NetworkStream
的说法,一切都很好。
这是一个关于游戏的问题,因此最好的情况是检测速度足够快(因为用户在游戏中可以移动,直到需要进行服务器调用,其中一些会阻塞用户界面,导致游戏似乎已经崩溃)。
我正在使用Unity,因此这是 .Net 2.0。