2015-08-11 3 views
0

Я действительно путать. Я могу подключить TCPClient к серверу tcp асинхронно. В моем обратном вызове я теперь хочу начать чтение некоторых данных, но когда я иду stream = tcpClient.GetStream();, моя программа точно не висит, она просто ничего не делает. Он не перейдет к следующей строке метода, но пользовательский интерфейс все еще работает (это Unity, возможно, он многопоточен или что-то еще).NetworkStream.GetStream() никогда не возвращается

public void SetupSocket() { 
     try { 
      tcpClient = new TcpClient(host, port); 
      tcpClient.BeginConnect(host, port, ConnectCallback, tcpClient); 
     } 
     catch (Exception e) { 
      // stuff happens 
      return; 
     } 
    } 

private void ConnectCallback(IAsyncResult result) { 
    if (ConnectedToServer != null) 
     ConnectedToServer(this, new ServerEventArgs("Connected to server.")); 

    Debug.Log("Where am I?"); // it does get here 

    try { 
     stream = tcpClient.GetStream(); 
    } 
    catch (InvalidOperationException e){ 
     Debug.Log(e); // no exception 
    } 


    Debug.Log("Hello?"); // never gets here 
    BeginReadData(); 
} 


public void BeginReadData() { 
    Debug.Log(stream.CanRead); // No log here! 
    if (stream.CanRead) { 
      stream.BeginRead(tcpStateObject.buffer, 0, tcpStateObject.bufferSize, EndReadData, stream); 
    } 
} 

Я действительно потерялся в этом пункте. Я могу видеть на моем сервере, что я подключился, и когда я отключился. Я отправляю два сообщения клиенту. Он использовался для работы с синхронными сокетами, но я хотел async.

+0

I поток не будет возвращаться до тех пор, пока не дойдет до конца, который возникает только тогда, когда соединение TCP закрывается, который я не люблю делать. Получатель должен знать, когда каждое сообщение будет завершено. При использовании TCP я обычно рекомендую завершить каждый метод, используя одну или комбинацию из следующих трех методов: 1) AScii: завершение с символом вроде \ n. 2) Ascii или Binary: добавление байтов. Count для начала каждого сообщения. 3) Ascii или Binary: использование сообщения фиксированной длины. Как и Write, это 4 байта, а Read - 7 байт. – jdweng

+0

Я использовал «» «Я думал, что это стандарт. – user3822370

+0

Как я могу проверить, завершен ли поток? Я не могу работать в потоке, как только я пойду GetStream – user3822370

ответ

0

Вот ответ

Я соединялся дважды

 tcpClient = new TcpClient(host, port); 
     tcpClient.BeginConnect(host, port, ConnectCallback, tcpClient); 
Смежные вопросы