在使用TCP异步方式时,若客户端直接使用socket.Connect方法进行判断时,当客户端与服务器进行连接,而服务器不存在时,程序处于无响应状态,怀疑此时客户端处于阻塞状态,需要过七八秒甚至十几秒才会抛出异常。  因此需要使用socket.BeginConnect方法进行异步连接。

当点击创建房间按钮时,会执行如下方法:ToConnect()

Socket客户端异步连接超时设置

如上图,其中原始方法会出现软件无响应的现象,方法二可行,当连接超时后,程序会直接跳到ReceiveCb方法中,执行如下红框中代码:

Socket客户端异步连接超时设置

因此需要在红框中去关闭socket、退出房间,但是退出房间会进行销毁gameObject,由于该方法是Socket回调方法不在Unity的主线程中,所以会出现程序报错,需要另外创建布尔标志位,在Update方法中去执行退出房间的方法,过程有点繁琐,因此使用第二种超时连接的方法。ConnectState()方法如下:

Socket客户端异步连接超时设置

这里创建了一个ManualResetEvent的线程,timeoutObj.WaitOne阻止当前线程,直到线程被唤醒或者超出等待时间才继续执行后面的代码. 测试发现,ConnectCb始终不会出现异常,clientSocket虽然不会空,当没有服务器时,clientSocket,Connected=false. 所以线程被唤醒,不会执行ConnectState方法种的if判断。  当连接超时后,退出房间,ToConnect方法在Unity的主线程中,退出正常。

相关文章:

  • 2022-01-01
  • 2021-12-22
  • 2021-12-05
  • 2021-08-31
  • 2021-08-11
  • 2021-10-10
猜你喜欢
  • 2021-12-31
  • 2022-01-01
  • 2021-07-31
  • 2021-04-17
  • 2021-08-29
  • 2021-12-08
  • 2021-06-22
  • 2021-11-22
相关资源
相似解决方案