Я пытаюсь реализовать простой http-сервер на Java, чтобы понять, как работает http-сервер.Теперь я могу отправить запрос из любого браузера и получить правильный ответ, однако, когда я пытаюсь смоделировать запрос от Почтальона, он всегда выдает java.net.SocketException: Broken pipe (Write failed)
исключение.
Мой http-сервер очень прост: после получения запроса, отправьте сообщение отправителю.
Реализация выглядит следующим образом: Исходный код
package com.ont.http;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SingleThreadHttpServer implements HttpServer {
public void run(int port) throws IOException {
ServerSocket serverSocket = new ServerSocket(port);
try {
while (true) {
Socket socket = serverSocket.accept();
BufferedReader inBufferReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuilder stringBuffer = new StringBuilder();
String inputLine;
while ((inputLine = inBufferReader.readLine()) != null && !inputLine.equals("")) {
stringBuffer.append(inputLine);
stringBuffer.append("\r\n");
}
System.out.println(stringBuffer.toString());
OutputStream outStream = socket.getOutputStream();
BufferedReader bufferedReader = new BufferedReader(new StringReader("A Message from server."));
// Header should be ended with '\r\n' at each line.
outStream.write("HTTP/1.1 200 OK\r\n".getBytes());
outStream.write("Main: OneServer 0.1\r\n".getBytes());
outStream.write("Content-length: 22\r\n".getBytes()); // if text/plain the length is required
outStream.write("Content-Type: text/plain\r\n".getBytes());
// An empty line is required after the header
outStream.write("\r\n".getBytes());
String line;
while ((line = bufferedReader.readLine()) != null) {
outStream.write(line.getBytes());
}
inBufferReader.close();
bufferedReader.close();
outStream.flush();
outStream.close(); // Socket will close automatically once output stream is closed.
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Любые типы запросов, отправленных почтальоном, будут немедленновызвать это исключение, и debug сообщает, что соединение с сокетом было потеряно во время outStream.write(...)
.если я отправляю из браузера, это никогда не вызовет этой проблемы.
Чего я не понимаю, так это того, что к Почтальону не должны применяться какие-либо настройки, потому что, когда я пытаюсь смоделировать запрос к своему коту, он обрабатывает все как талисман, должно быть что-то пропалоне так с моим кодом, но я не знаю, где и почему.
Буду признателен за любые подсказки или подсказки, спасибо.
----- Обновления ----
С консоли почтальона я вижу это исключение,
Error: read ECONNRESET
Request Headers:
accept:"text/plain"
cache-control:"no-cache"
Если я оставил только outStream.write("HTTP/1.1 200 OK\r\n".getBytes())
эту строку и удалил все остальные outStream.write...
, и браузеры, и почтальон работают как шарм.это действительно тянет меня за волосы, но почему?