2012-01-24 2 views
4

Я написал HTTP-сервер в Java и клиент на C++ с Poco. Это часть кода клиентской C++:Poco :: HttpClientSession.receiveResponse() throws NoMessageException без видимых причин

URI uri("http://127.0.0.1:4444"); 
HTTPClientSession session(uri.getHost(), uri.getPort()); 

HTTPRequest req(HTTPRequest::HTTP_POST, 
       "/pages/page", 
       HTTPMessage::HTTP_1_1); 

session.sendRequest(req); 
HTTPResponse res; 
std::istream &is = session.receiveResponse(res); 

В последней строке я получаю следующее сообщение об ошибке:

terminate called after throwing an instance of 'Poco::Net::NoMessageException' 
    what(): No message received 

Но я не понимаю, почему. Соединение было успешно установлено, и запрашиваемая страница существует. Я пробовал тот же код с известными веб-сайтами (например, Wikipedia), и он работает без каких-либо исключений.

Я также попытался сделать тот же запрос с cURL (на моем сервере) в командной строке и отобразить ответ сервера, поэтому сервер кажется прекрасным.

Это оригинальный ответ сервера в виде строки:

"HTTP/1.1 200 OK\r\n" + 
"Server: [server name]\r\n" + 
"Content-Type: text/xml; charset=utf-8\r\n" + 
"Content-Length:" + bodyBytes.length + "\r\n" + 
"Resource: " + job.resId + "\r\n\r\n" + 
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><JobRequest><InputRepresentation id=\"0\"/> <effectsList><cvtColor><code> CV_RGB2GRAY </code></cvtColor><resize><scaleFactorX> 0.5 </scaleFactorX><scaleFactorY> 0.5 </scaleFactorY><interpolation> INTER_LINEAR </interpolation></resize><GaussianBlur><kSize> 3 </kSize><sigmaX> 2 </sigmaX><sigmaY> 2 </sigmaY><borderType> BORDER_REPLICATE </borderType></GaussianBlur></effectsList></JobRequest>" 

Я написал простой сервер HTTP, который реагировать с фиксированным ответом на каждый запрос, чтобы проверить, что случилось. это код:

public class Test { 
    public static void main(String[] args) {  
     try { 
      ServerSocket serverSocket = new ServerSocket(4449); 
      Socket clientSocket = serverSocket.accept(); 

      String body = "ab"; 
      byte[] bodyBytes = body.getBytes("UTF-8"); 

      String headers = "HTTP/1.1 200 OK\r\n" + 
          "Server: Foo\r\n" + 
          "Content-Type: text/plain\r\n" + 
          "Content-Length: " + bodyBytes.length + "\r\n\r\n"; 

      byte[] headerBytes = headers.getBytes("UTF-8"); 

      byte[] responseBytes = new byte[headerBytes.length + bodyBytes.length]; 

      /* Fill responseBytes with the header and body bytes */ 
      int i = 0; 
      for (int j = 0; j < headerBytes.length; ++j) { 
       responseBytes[i] = headerBytes[j]; 
       ++i; 
      } 
      for (int j = 0; j < bodyBytes.length; ++j) { 
       responseBytes[i] = bodyBytes[j]; 
       ++i; 
      } 
      clientSocket.getOutputStream().write(responseBytes); 

     } catch (IOException e) {} 
    } 
} 

Я получаю то же исключение даже с этим сервером. Так что здесь не так?

+0

Скорее всего, выход вашего сервера нарушает какое-либо правило протокола, которое допускает cURL. Если вы можете перехватить необработанное TCP-соединение и отправить запрос и ответ, это поможет. Если вам просто нужно быстро исправить ошибку, попробуйте HTTP 1.0 вместо 1.1 (в запросе) - есть меньше вещей, чтобы ошибиться. –

+0

Пробовал. Получено одно и то же исключение :( –

+0

Как перехватить необработанное TCP-соединение? –

ответ

1

Основываясь на экспериментах, я обнаружил, что необходимо добавить заголовок Content-Length, если вы делаете пустой запрос POST. I.e.,

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