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

时间:2016-03-04 16:04:38

标签: c# unity3d client-server

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

我也在各个帖子中建议使用连接超时,但没有帮助。

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 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

    将您的代码更改为

    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
    }   
    

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

    然后,您可以通过执行

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

    确保包含 using System.Threading ;

    如果您打算从服务器接收数据,请务必同时执行此操作,否则会阻止并挂起您的应用。

    您在接收功能中所要做的就是添加:

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

    您可以在此处详细了解线程 http://www.albahari.com/threading/