当客户端尝试连接到不是 运行 的 c# 服务器时,Unity 冻结

Unity freezes when client tries to connect to c# server which is not running

我正在使用客户端-服务器架构创建一个简单的统一应用程序。只要服务器打开,我的应用程序就可以正常工作。如果我在服务器未 运行ning 时不小心尝试 运行 客户端,unity 应用程序会冻结。

我也按照各种帖子中的建议使用了连接超时,但没有帮助。

void Awake () {
        init ();    
    }
void init() {
        IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse (serverHost), serverPort);
        client = new Socket (endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        try {
            client.SendTimeout = 1000;
            client.ReceiveTimeout = 1000;
            client.Connect (endpoint);
            error = "";
        } catch(Exception e) {
            error = e.Message;
            new WaitForSeconds(1);
        }

欢迎提出任何建议。

谢谢。

您的客户端正在冻结,因为套接字阻塞。连接超时也解决不了这个问题。

我知道有两种方法可以解决这个问题。

  1. 第一种方法是使用线程调用包含网络代码的函数,这样它就不会冻结。

  2. 第二种方法是使用异步套接字https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx

我将提供第一种方法的示例,因为我认为它更容易。

我没有你所有的代码,所以我会尽量提供。

将代码更改为

using System;
using System.Threading;

bool connected = false;

void init() {

    // Create a new Thread
    new Thread (() =>
    {
        IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse (serverHost), serverPort);
        client = new Socket (endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        try {
            client.SendTimeout = 1000;
            client.ReceiveTimeout = 1000;
            client.Connect (endpoint);
            error = "";
            connected = true;

        } catch(Exception e) {
            connected = false;
            error = e.Message;
            new WaitForSeconds(1);
        }
    }).Start(); // Start the Thread
}   

这将创建一个新线程并启动该线程。在该线程内,它将套接字连接代码而不阻塞您的应用程序。

然后您可以稍后通过

检查您是否连接到服务器
if(connected){
    // ...
}

确保包含 using System.Threading;

如果您计划从服务器接收数据,请确保也这样做,否则它会阻止并挂起您的应用程序。

你在接收函数中所要做的就是添加:

new Thread (() =>
{
    // .....You receiving code here
}).Start();

您可以在此处了解有关 线程 的更多信息 http://www.albahari.com/threading/