2016-03-18 3 views
0

В настоящее время разрабатывает простой сервер сообщений с помощью сокетов и иногда TCPClient принимает правильное число байт, но каждый байт равен 0.TCPClient иногда ПОЛУЧАТЬ пустые байты массив

Вот код отправителя.

 try 
     { 
      //c.clientSocket.NoDelay = true; 

      // Send back an OK      
      var clientStream = c.clientSocket.GetStream();     

      var Response = JsonConvert.SerializeObject(new Packet("SERVER", c.ClientName, new List<Payload>() { new Payload(MessageLibrary.Commands.OK, null) })); 

      var msg = System.Text.Encoding.ASCII.GetBytes(Response); 

      clientStream.Write(msg, 0, msg.Length);     
     } 
     catch (Exception ex) 
     { 
      if (ExceptionRaised != null) 
       ExceptionRaised(c.ClientName, ex); 
     } 

Response = "{\"TimeStamp\":\"2016-03-18T08:15:15.0881326+00:00\",\"Sender\":\"SERVER\",\"Payload\":[{\"Command\":\"OK\",\"CommandValue\":\"\"}],\"Destination\":\"GBCO0101\"}"

Msg содержит 139 байт

Так что это, кажется, хорошо, вот принимающий код.

static void OnDataRecieved(IAsyncResult result) 
    { 
     TcpClient client = result.AsyncState as TcpClient; 

     // Get a stream object for reading and writing 
     try 
     { 
      NetworkStream stream = client.GetStream(); 

      int ReadBytes = stream.EndRead(result); 

      if (ReadBytes == 0) 
      { 
       // Client gone 
       Console.WriteLine("Server lost"); 
      } 
      else 
      { 
       // Translate data bytes to a ASCII string. 
       var data = System.Text.Encoding.ASCII.GetString(ClientReadBuffer, 0, ReadBytes); 

       ClientReadBuffer = new byte[ClientReadBuffer.Length]; 

       stream.BeginRead(ClientReadBuffer, 0, ClientReadBuffer.Length, new AsyncCallback(OnDataRecieved), client); 

       ProcessData(data); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("lost connection"); 
      Console.WriteLine(ex.Message); 
     } 
    } 

Если я взгляну на ProcessData(data); я могу видеть, что данные = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"

ReadBytes = 139

Так нужное количество байт кажется правильным, но сами данные неправильно. Что может вызвать это?

+0

Возможно, это то, что сервер действительно отправляет? – Ian

+0

@ И тогда почему он это делает? – Gaz83

+1

Невозможно. Вы действительно используете 'ClientReadBuffer' в первом' stream.BeginRead() '(он не включен в код выше)? И почему вы создаете новый экземпляр для каждого чтения? Отходы ресурсов. Просто используйте его повторно. – jgauffin

ответ

1

Это маловероятно.

Вы действительно используете ClientReadBuffer на первом stream.BeginRead() (он не включен в код выше)? У вас, вероятно, есть место, где не читается так же.

И почему вы создаете новый экземпляр для каждого чтения? Отходы ресурсов. Просто используйте его повторно.

Другое дело, что TCP основан на потоке. Не ожидайте, что полученные байты совпадут с отправляемым вами буфером. См. Это question, например.

+0

[... или этот] (http://stackoverflow.com/a/35240061/3740093) (хотя он находится в VB.NET, но классы могут быть скомпилированы в DLL) –