2015-04-16 3 views
0

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

  1. Синхронный прием.
  2. Асинхронный прием.

Используя синхронный прием, я получаю весь ответ от сервера менее чем за 1 секунду. Но, используя асинхронный прием, для получения всех ответов требуется более 30 секунд.

Вот код:

class StateObject 
{ 
    // Client socket. 
    public Socket workSocket = null; 
    // Size of receive buffer. 
    public const int BufferSize = 256; 
    // Receive buffer. 
    public byte[] buffer = new byte[BufferSize]; 
    // Received data string. 
    public StringBuilder sb = new StringBuilder(); 
} 

    private static void Receive(Socket client) 
    { 
     try 
     { 
      // Create the state object. 
      StateObject state = new StateObject(); 
      state.workSocket = client; 

      // Begin receiving the data from the remote device. 
      client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
       new AsyncCallback(ReceiveCallback), state); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

    private static void ReceiveCallback(IAsyncResult ar) 
    { 
     try 
     { 
      // Retrieve the state object and the client socket 
      // from the asynchronous state object. 
      StateObject state = (StateObject)ar.AsyncState; 
      Socket client = state.workSocket; 
      // Read data from the remote device. 
      int bytesRead = client.EndReceive(ar); 
      if (bytesRead > 0) 
      { 
       // There might be more data, so store the data received so far. 
       state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); 
       // Get the rest of the data. 
       client.ReceiveTimeout = 500; 
       client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
        new AsyncCallback(ReceiveCallback), state); 
      } 
      else 
      { 
       // All the data has arrived; put it in response. 
       if (state.sb.Length > 1) 
       { 
        response = state.sb.ToString(); 
       } 
       // Signal that all bytes have been received. 
       receiveDone.Set(); 
      } 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
     } 
    } 
+0

Что вы хотите сказать? –

+0

Я думаю, что вопрос ясен (* почему * задержка) - я не уверен на 100%, но вы можете проверить флаг 'SocketFlags.Partial' с кодом? – Carsten

+0

Как я могу получать данные так же быстро, как синхронный метод? –

ответ

0

Вы должны проверить свое значение после того, как вы добавите текущую строку в буфер, для того, чтобы обработать сообщение и удалить client.ReceiveTimeout = 500; который я думаю, что занимает время:

 if (bytesRead > 0) 
     { 
      state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); 

      response = state.sb.ToString(); 
      if (response.IndexOf("<EOF>") != -1) 
      { 
       state.sb.Clear(); 
       receiveDone.Set(); 
      } 
      else 
      { 
       client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
        new AsyncCallback(ReceiveCallback), state); 
      } 
     } 

Это будет работать только для одного сообщения с, в режиме реального времени несколько сообщений, я думаю, вы должны попробовать другой подход.