2015-05-12 3 views
3

Я пытаюсь реализовать свое приложение с асинхронной связью сокетов. Он отлично связан и отправил запрос, но я не получил никаких данных с сервера (Java-сервера). Соединение гнездАсинхронный клиентский сокет не принимает данные

client.BeginConnect(hostname, port, 
      new AsyncCallback(ConnectCallback), client); 
connectDone.WaitOne(); 

    private static void ConnectCallback(IAsyncResult ar) { 
    try { 
     // Retrieve the socket from the state object. 
     Socket client = (Socket) ar.AsyncState; 

     // Complete the connection. 
     client.EndConnect(ar); 

     Console.WriteLine("Socket connected to {0}", 
      client.RemoteEndPoint.ToString()); 

     // Signal that the connection has been made. 
     connectDone.Set(); 
    } catch (Exception e) { 
     Console.WriteLine(e.ToString()); 
    } 
} 

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, SocketFlags.None, 
      new AsyncCallback(ReceiveCallback), client); 
    } 
    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); 
     Console.WriteLine(response); 
     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.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) 
    { 
     Console.WriteLine(e.ToString()); 
    } 
} 

Любая помощь будет принята с благодарностью.

+1

ну и «ConnectCallback» отсутствует - также: откуда вы знаете, что вы подключены? Вы отлаживали этот код (установить контрольную точку в 'ReceiveCallback'?). Пробовали ли вы подключиться через * telnet *? Конечно, если вы начнете получать, и там уже не было данных, вы можете увидеть '0' байт и остановить все – Carsten

+0

connected = true; это свойство отображается в режиме отладки. И я установил точки останова в методе receivecallback, но он не был выполнен. Это была отладка до начала получения после этого, она заканчивается в режиме отладки. И я не пробовал telnet. –

+0

Вы также можете проверить это также http://stackoverflow.com/a/1388691/1537726 – csharpwinphonexaml

ответ

0

Ваш код почти нормально, с одной серьезной ошибкой. В вашем BeginReceive вы помещаете в качестве объекта состояния экземпляр сокета клиента. В функции ReceiveCallback вы передаете ее в объект StateObject вместо сокета. Это приведет к появлению исключения на консоли.

Тем не менее, также с этой ошибкой срабатывает точка останова в начале функции ReceiveCallback. Вы попробовали это? Исключение должно было быть выброшено в любом случае.

В случае, если точка останова не срабатывает, вы должны обязательно проверить, действительно ли что-то действительно отправлено с сервера. Конечно, все это предполагало, что соединение работает, как вы сказали.

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