我正在尝试仅使用Java中的Socket
和BufferedReader
类来读取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发送请求。
我遇到了this线程中描述的完全相同的问题,但是那里提出的解决方案没有用。该请求仍然到达最后一个标题,而不是更多。提前谢谢。
编辑:问题解决了! 根据答案提出的建议,我将阅读更改为:
reader = new DataInputStream(socket.getInputStream());
String comando = "";
while( (dt = reader.readByte()) >= 0){
comando += dt;
//... do the rest of the stuff
}
将其作为二进制文件读取,可以到达请求的body
部分。
答案 0 :(得分:3)
我远不是一个Java大师,但我敢打赌\r\n
只有在找到\r\n
序列时才返回结果。由于您的身体未以readLine
终止,因此方法InputStreamReader
永远不会返回。尝试手动将该字符序列添加到您的身体并查看会发生什么,或者使用原始\r\n
将主体读取为字节数组。
永远不会少,你不能指望任何http体实际上是一个字符串。它也可以是一个二进制序列,它对genTexData
一无所知。