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

在使用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的主线程中,退出正常。