2016-03-04 1 views
1

Я создаю приложение простого единства с использованием арки client-server. Мое приложение работает нормально, пока сервер включен. Если случайно я пытаюсь запустить клиент, пока сервер не запущен, приложение объединения замерзает.Unity зависает, когда клиент пытается подключиться к серверу C#, который не запущен.

Я также использовал время ожидания соединения, как предлагалось в различных сообщениях, но без помощи.

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); 
     } 

Любые предложения могут быть приветствованы.

Спасибо.

+0

вы должны notifie пользователя, что сервер вниз и спросить попробуйте еще раз позже. –

+0

Вы поставили точку останова (или 'Debug.Log') в catch, чтобы увидеть, было ли выбрано исключение или он просто удерживает поток в строке' client.Connect'? –

ответ

3

Ваш клиент замерзает, потому что блоки блокировки. Время соединения также не решит эту проблему.

Есть 2 пути, которые я знаю, чтобы решить эту проблему.

  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/