2016-08-03 7 views
1

Я написал TCP-сервер, в котором количество прочитанных байтов префикс в двухбайтовом заголовке. После чтения из потока и отправки ответа обратно клиенту удаляются как NetworkStream, так и TcpClient. Проблема в том, что клиент, похоже, не получил моего ответа, если я не раскомментирую строку Thread.Sleep(). Вот код:NetworkStream Sleep() issue

using (var tcpClient = await tcpServer.AcceptTcpClientAsync()) 
{ 
    tcpClient.NoDelay = true; 

    using (var stream = tcpClient.GetStream()) 
    { 
     var twoBytesHeader = new TwoByteHeader(); 
     var headerBuffer = new byte[twoBytesHeader.HeaderLength]; 

     using (var binaryReader = new BinaryReader(stream, Encoding.ASCII, true)) 
     { 
      headerBuffer = binaryReader.ReadBytes(twoBytesHeader.HeaderLength); 

      int newOffset; 
      var msgLength = twoBytesHeader.GetMessageLength(headerBuffer, 0, out newOffset); 

      var buffer = binaryReader.ReadBytes(msgLength); 

      string msgASCII = Encoding.ASCII.GetString(buffer); 

      var bufferToSend = await ProcessMessage(msgASCII); 

      using (var binaryWriter = new BinaryWriter(stream, Encoding.ASCII, true)) 
      { 
       binaryWriter.Write(bufferToSend); 
       binaryWriter.Flush(); 
      } 

      //Thread.Sleep(1000); 
     } 
    } 
} 

Когда Сон раскомментирована, клиент получает ответ, а затем указывает на то, что клиент disconected. Я не могу понять причину такого поведения.

+0

Если вам нужно быть уверенным, что при отправке ваших данных не было ошибок, тогда async может не быть ответом, конечно, вы хотите отправить его, знать, что его отправили, а затем закрыть? – BugFinder

+0

Благодарим за отзыв. В этом случае я ожидаю WriteAsync, поэтому он будет ждать, пока все байты будут отправлены и только затем закроют соединение. Должно быть что-то еще, что я делаю неправильно. – GAG

ответ

2

Вы считаете, что чтение будет считывать столько байтов, сколько вы указали. Вместо этого он будет читать хотя бы один байт. Ваш код должен быть в состоянии справиться с этим. BinaryReader.ReadBytes позволит вам прочитать точное количество байтов и избавиться от некоторых ваших шаблонов.

Кроме того, вы, вероятно, не должны использовать кодировку ASCII, которая является наихудшей возможной кодировкой.

+0

Благодарим вас за то, что указали на возможную проблему с чтением с помощью потока, я учту это. Что касается кодирования, у меня нет выбора, поскольку клиент отправляет ASCII-кодированные сообщения. Во всяком случае, я все еще не могу понять, зачем ставить Sleep() после потока. Flush() заставляет клиента получать ответ. Я читал о алгоритме Нагле, но я полагаю, что Flush действует так же, как если бы я установил свойство NoDelay – GAG

+0

Возможно, клиент сломан? Отправьте код; Проблема, которую я описал, может привести к сбою сервера, а не к отправке. Поэтому вы, вероятно, должны все это исправить и опубликовать новый код. Flush на NetworkStream ничего не делает. Он ничего не может изменить. – usr

+0

Проблема в том, что клиент является внешним приложением, к которому у меня нет доступа. простой клиент, который я написал для тестирования, просто прекрасен. Я сделаю изменения, которые вы предложили, и посмотрите, помогает ли это, спасибо – GAG

 Смежные вопросы

  • Нет связанных вопросов^_^