2013-08-13 2 views
3

Привет Я пытаюсь отправить строку с клиента на сервер. Это не работает, поэтому я пытаюсь проверить функции ниже, отправив данные и получая данные на одном компьютере.Передача и получение данных C# с использованием сетевого потока

Проблема, с которой я столкнулся, заключалась в том, что _serverStream.DataAvailable в ReceiveData() всегда возвращает false. Как проверить правильность работы обеих функций? Не удается ли _serverStream отправлять/получать данные?

public void SendData(string dataToSend) 
    { 
     if (string.IsNullOrEmpty(dataToSend)) 
      return; 

     _serverStream = _serverClient.GetStream(); 
      byte[] outStream = Encoding.UTF8.GetBytes(dataToSend); 
      _serverStream.Write(outStream, 0, outStream.Length); 
      //_serverStream.Flush(); 
    } 

    public string ReceiveData() 
    { 

     StringBuilder message = new StringBuilder(); 
     _serverStream = _serverClient.GetStream(); 
     _serverStream.ReadTimeout = 100; 
     while (true) 
     { 

      if (_serverStream.DataAvailable) 
      { 
       int read = _serverStream.ReadByte(); 
       if (read > 0) 
       { 
        message.Append((char)read); 
       } 
       else 
       { 
        break; 
       } 
      } 
      else if (message.ToString().Length > 0) 
      { 
       break; 
      } 
     } 
     return message.ToString(); 
    } 

Я называю SendData() и ReceiveData(), как показано ниже:

tcpclient.SendData(username); 
    string test = tcpclient.ReceiveData(); 
    MessageBox.Show(test); 
+0

Ваше использование DataAvailable является ошибкой. Неправильно используются почти все способы использования DataAvailable. Найдите DataAvailable, чтобы узнать, почему. – usr

ответ

2

Хотя это не показано в коде, я предполагаю, что _serverClient является TcpClient.

В обоих методах вы получаете сетевой поток из того же _serverClient, так что вы получаете доступ к сетевому потоку точно такого же. И, похоже, вы ожидаете, что при записи данных в сетевой поток в SendData вы должны будете прочитать те же данные в пределах ReceiveData, что неверно.

При записи данных в сетевой поток на самом деле отправлено по сети - оно недоступно для чтения из того же сетевого потока. Вы можете читать только данные, которые вы получили с с удаленной конечной точки. Другими словами, если у вас нет удаленной конечной точки, отправляющей обратно данные, у вас не будет DataAvailable для чтения.

В ReceiveData вы должны получать сетевой поток со стороны сервера, например. от TcpClient, который был возвращен, позвонив по номеру TcpListener.AcceptTcpClient, а не из тех же TcpClient, которые вы использовали для отправки данных.

+0

Большое спасибо за ваш совет! Я понял, что использую тот же сетевой поток, поэтому спасибо за разъяснение. – user1779026

+0

@Eren: Если мы хотим читать, а затем писать, нам нужно создать два сетевых потока? – user1282609

+1

Нет, вам не нужно. Вы можете читать и писать в одном сетевом потоке. Однако, когда вы пишете, вы не сможете прочитать эти байты из одного и того же сетевого пара. Вы можете читать только байты, отправленные с удаленной стороны. Это как телефон, вы можете говорить и слушать одновременно, но вы слушаете только то, что сказала другая сторона. Вы ничего не говорите, кроме как услышать свои слова. –