当客户端试图连接到未运行的c#服务器时,Unity将冻结

当客户端试图连接到未运行的c#服务器时,Unity将冻结,c#,unity3d,client-server,C#,Unity3d,Client Server,我正在使用客户机-服务器arch创建一个简单的unity应用程序。只要服务器打开,我的应用程序就可以正常工作。如果我在服务器未运行时意外尝试运行客户端,unity应用程序将冻结 我还使用了各种帖子中建议的连接超时,但没有任何帮助 void Awake () { init (); } void init() { IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse (serverHost), ser

我正在使用客户机-服务器arch创建一个简单的unity应用程序。只要服务器打开,我的应用程序就可以正常工作。如果我在服务器未运行时意外尝试运行客户端,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);
        }
欢迎提出任何建议


谢谢。

由于套接字阻塞,您的客户端已冻结。连接超时也无法解决此问题

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

  • 第一种方法是使用线程调用包含网络代码的函数,使其不会冻结

  • 第二种方法是使用异步套接字。

  • 我将提供第一种方法的例子,因为我认为比较容易。

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

    将代码更改为

    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){
        // ...
    }
    
    确保使用System.Threading时包含

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

    在接收功能中,您只需添加:

    new Thread (() =>
    {
        // .....You receiving code here
    }).Start();
    
    您可以在此处了解有关线程的更多信息

    您应该通知用户服务器已关闭,并要求他稍后重试。您是否在catch中放置了断点(或
    Debug.Log
    ),以查看是否引发异常,或者它是否仅在
    客户端.Connect
    行保留线程?