2012-06-11 3 views
1

У меня возникли проблемы с выяснением, почему я получаю только один ответ от серверного приложения, запущенного на моем компьютере (LocalHost). У меня нет источника для этого серверного приложения, но это Java-приложение. Сообщения, которые отправляются, представляют собой структуру xml и должны заканчиваться тегом EoT.C# гнездо. Только для получения первого сообщения

Связь:

  1. Клиент подключения к разъединить.
  2. Клиент отправляет сообщение серверу.
  3. Сервер отправляет сообщение, полученное клиенту.
  4. Клиент отправляет сообщение серверу.
  5. Сервер отправляет символ окончания передачи.
  6. Клиент отправляет сообщение серверу.
  7. Сервер отправляет символ окончания передачи.

Это как мой клиент подключения, отправлять и получать:

public bool ConnectSocket(string server, int port) 
{ 
System.Net.IPHostEntry hostEntry = null; 

    try 
    { 
     // Get host related information. 
     hostEntry = System.Net.Dns.GetHostEntry(server); 
    } 
    catch (System.Exception ex) 
    { 
      return false; 
    } 


    // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid 
    // an exception that occurs when the host IP Address is not compatible with the address family 
    // (typical in the IPv6 case). 
    foreach (System.Net.IPAddress address in hostEntry.AddressList) 
    { 
      System.Net.IPEndPoint ipe = new System.Net.IPEndPoint(address, port); 
      System.Net.Sockets.Socket tempSocket = new System.Net.Sockets.Socket(ipe.AddressFamily, System.Net.Sockets.SocketType.Stream, 
                       System.Net.Sockets.ProtocolType.Tcp); 
      tempSocket.Connect(ipe); 

      if (tempSocket.Connected) 
      { 
       m_pSocket = tempSocket; 
       m_pSocket.NoDelay = true; 
       return true; 
      } 
      else 
       continue; 
     } 
     return false; 
    } 
} 

public void Send(string message) 
{ 
    message += (char)4;//We add end of transmission character 
    m_pSocket.Send(m_Encoding.GetBytes(message.ToCharArray())); 
} 

private void Recive() 
{ 
    byte[] tByte = new byte[1024]; 
    m_pSocket.Receive(tByte); 
    string recivemessage = (m_Encoding.GetString(tByte)); 
} 

ответ

3

Ваш Receive код выглядит очень неправильно; вы никогда не должны предполагать, что пакеты поступают в те же конструкции, что сервер отправляет сообщения - TCP - это просто поток. Итак: вы должны поймать доход от Receive, чтобы узнать, сколько байтов вы получили. Он может быть частью одного сообщения, целого сообщения, нескольких целых сообщений или последней половины одного сообщения и первой половины следующего. Как правило, вам нужно какое-то «кадрирование» решения, которое может означать «сообщения, разделенные символами LF», или может означать «длина каждого сообщения с префиксом по порядковому номеру в байтах», 4 байта ». Обычно это означает, что вам нужно буферизировать, пока у вас не будет полный кадр, и беспокоятся о запасных данных в конце буфера, который является частью следующего кадра. Ключевые биты для добавления, хотя:

int bytes = m_pSocket.Receive(tByte); 
// now process "bytes" bytes **only** from tByte, nothing that this 
// could be part of a message, an entire message, several messages, or 
// the end of message "A", the entire of message "B", and the first byte of 
// message "C" (which might not be an entire character) 

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

В вашем цикле приема могут также возникнуть проблемы, но вы не показываете, что (ничего не вызывает Receive), поэтому мы не можем комментировать.

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