Java Socket没有接收到http请求的正文

时间:2016-09-11 14:10:05

标签: java sockets

我正在尝试仅使用Java中的SocketBufferedReader类来读取HTTP请求。问题是我无法到达请求的正文部分。缓冲读卡器只给我请求行和标题。以下是代码的一部分:

bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String comando = "";
        while((msgDoSocket = bufferedReader.readLine()) != null){
            //telaOutput.adicionaFim(msgDoSocket);
            try {
                comando += msgDoSocket + " ";
                //System.out.println(comando);
                if(msgDoSocket.isEmpty()){
                    processaInput(comando);
                }
            } catch (Exception ex) {
                Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }


这是一个WireShark捕获,显示正在发送POST正文。我的程序在端口15000上运行,数据只是一个字符串“teste12345”。我正在使用Google Chrome中的应用POSTMAN发送请求。

enter image description here

我遇到了this线程中描述的完全相同的问题,但是那里提出的解决方案没有用。该请求仍然到达最后一个标题,而不是更多。提前谢谢。

编辑:问题解决了! 根据答案提出的建议,我将阅读更改为:

reader = new DataInputStream(socket.getInputStream());


String comando = "";
while( (dt = reader.readByte()) >= 0){
  comando += dt;
  //... do the rest of the stuff
}

将其作为二进制文件读取,可以到达请求的body部分。

1 个答案:

答案 0 :(得分:3)

我远不是一个Java大师,但我敢打赌\r\n只有在找到\r\n序列时才返回结果。由于您的身体未以readLine终止,因此方法InputStreamReader永远不会返回。尝试手动将该字符序列添加到您的身体并查看会发生什么,或者使用原始\r\n将主体读取为字节数组。

永远不会少,你不能指望任何http体实际上是一个字符串。它也可以是一个二进制序列,它对genTexData一无所知。