Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自行创建的http服务器无法处理邮递员请求_Java_Sockets_Postman_Serversocket_Httpserver - Fatal编程技术网

Java 自行创建的http服务器无法处理邮递员请求

Java 自行创建的http服务器无法处理邮递员请求,java,sockets,postman,serversocket,httpserver,Java,Sockets,Postman,Serversocket,Httpserver,我试图用Java实现一个简单的http服务器,以了解http服务器是如何工作的。现在,我可以从任何浏览器发送请求并接收正确的响应,但是,当我尝试模拟来自Postman的请求时,它总是抛出java.net.SocketException:breaked pipe(Write failed)异常 我的http服务器非常简单:一旦收到请求,就向发送者回显消息 具体实施情况如下: 从Postman发送的任何类型的请求都会立即触发该异常,并且debug会告知套接字连接在扩展流.write(…)期间丢失。如

我试图用Java实现一个简单的http服务器,以了解http服务器是如何工作的。现在,我可以从任何浏览器发送请求并接收正确的响应,但是,当我尝试模拟来自Postman的请求时,它总是抛出
java.net.SocketException:breaked pipe(Write failed)
异常

我的http服务器非常简单:一旦收到请求,就向发送者回显消息

具体实施情况如下:

从Postman发送的任何类型的请求都会立即触发该异常,并且debug会告知套接字连接在
扩展流.write(…)
期间丢失。如果我从浏览器发送,它永远不会触发该问题

我不明白的是,邮递员不应该有任何设置,因为当我尝试模拟对我的tomcat的请求时,它会像处理符咒一样处理所有事情,我的代码一定出了问题,但我不知道在哪里,为什么

任何帮助或提示都将不胜感激,谢谢

-----更新----

从邮递员控制台,我可以看到这个异常

Error: read ECONNRESET
Request Headers:
accept:"text/plain"
cache-control:"no-cache"

如果我只留下
outStream.write(“HTTP/1.1200 OK\r\n).getBytes())
这一行,并删除所有其他
outStream.write…
,浏览器和邮递员都会很有魅力。这真让我毛骨悚然,但为什么呢?

异常意味着另一端已经关闭了连接,而您仍在尝试写入连接

这只是猜测,但邮递员可能不喜欢它得到的回应,只是放弃了。浏览器可能仍然会尽力接受您正在做的事情,但这并不一定意味着响应是正确的。我不知道整个http规范,所以我不能立即告诉你是否是这样。要继续,也许您可以看看像Fiddler这样的工具,看看在一个基本请求之后http服务器通常会返回什么,然后看看您是否遗漏了什么


首先,我可以看到内容长度是硬编码的,尽管我不希望这会给您带来例外。

我能够重现问题并确定其根本原因。Postman为所有
localhost
URL连接服务器两次。第一个连接只是为了检查服务器的可访问性,它会立即关闭,而无需等待服务器的响应。如果服务器是可访问的,那么它将再次连接并发送第二个请求,并显示第二个请求的响应

对于您发布的服务器,当来自Postman的第一个连接关闭时,它会崩溃。由于Postman在不等待第一个连接的完整响应的情况下关闭连接,因此服务器中的多个
outStream.write()
调用将引发异常(
java.net.SocketException:breaked pipe(write failed)
),导致服务器崩溃。因此,邮递员发送的第二个请求将不会得到任何响应

我认为这是邮递员应用程序的一个问题,应该予以修复。但另一方面,这种类型的错误也应该在服务器端正确处理,以防止崩溃。如果客户端在发送响应的服务器中间破坏连接(即,使用任何浏览器发出请求、发送非常大的响应或在后续
outStream.write()之间保持延迟),则不仅邮递员应用程序,而且使用其他工具发送的请求也可能导致服务器崩溃
calls,在收到完整响应之前关闭浏览器选项卡,这将使服务器崩溃)

请参阅下面发布的修改后的服务器代码,该代码适用于此类情况:

import java.io.*;
导入java.net.ServerSocket;
导入java.net.Socket;
公共类SingleThreadHttpServer实现HttpServer{
公共无效运行(int端口)引发IOException{
ServerSocket ServerSocket=新的ServerSocket(端口);
试一试{
while(true){
Socket=serverSocket.accept();
BufferedReader inBufferReader=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
StringBuilder stringBuffer=新的StringBuilder();
字符串输入线;
而((inputLine=inBufferReader.readLine())!=null&&!inputLine.equals(“”){
追加(inputLine);
stringBuffer.append(“\r\n”);
}
System.out.println(stringBuffer.toString());
OutputStream outStream=socket.getOutputStream();
BufferedReader BufferedReader=新的BufferedReader(新的StringReader(“来自服务器的消息”);
试一试{
//标题应在每行以“\r\n”结尾
outStream.write(“HTTP/1.1200 OK\r\n”.getBytes());
//outStream.write(“Main:OneServer 0.1\r\n”.getBytes());
outStream.write(“内容长度:22\r\n”.getBytes());//如果text/plain是必需的长度
outStream.write(“内容类型:text/plain\r\n”.getBytes());
//outStream.write(“连接:关闭\r\n”.getBytes());
//标题后面需要一个空行
outStream.write(“\r\n”.getBytes());
弦线;
而((line=bufferedReader.readLine())!=null){
outStream.write(line.getBytes());
}
冲水;
outStream.close();//一旦输出流关闭,套接字将自动关闭。
}捕获(SocketException e){
//处理客户端在服务器写入连接时关闭连接的情况
socket.close();
}
bufferedReader.close();
Error: read ECONNRESET
Request Headers:
accept:"text/plain"
cache-control:"no-cache"