У меня есть два случая, когда я получаю запросы из браузера и возвращаю ресурсы или HTML-страницу. Следующий код делает это:
public void sendData(String someString) {
switch(someString.replaceAll("\\s","")) {
case "HTTP":
try {
String string = someString.replace("HTTP", "");
Path path = Paths.get(getClass().getClassLoader().getResource("index.html").toURI());
byte[] fileBytes = Files.readAllBytes(path);
String data = new String(fileBytes);
String statusLine = "HTTP/1.1 200 OK";
String contentTypeLine = "Content-Type: text/html; charset=UTF-8";
String contentlength = "Content-Length: " + fileBytes.length;
DataOutputStream outToClient = new DataOutputStream(this.getConnection().getOutputStream());
outToClient.writeBytes(statusLine);
outToClient.writeBytes(contentlength);
outToClient.writeBytes(contentTypeLine);
outToClient.writeBytes(this.getServerTime());
outToClient.writeBytes(data);
outToClient.flush();
outToClient.close();
} catch(IOException | URISyntaxException e) {
System.out.println("Exception is " + e);
}
break;
default:
try {
String string = someString.replace("HTTP", "").replaceAll("\\s", "");
DataOutputStream outToClient = new DataOutputStream(this.getConnection().getOutputStream());
String statusLine = "HTTP/1.1 200 OK";
String contentTypeLine = "Content-Type: jpg";
String contentlength = "Content-Length: ";
outToClient.writeBytes(statusLine);
outToClient.writeBytes(contentlength);
outToClient.writeBytes(contentTypeLine);
outToClient.writeBytes(this.getServerTime());
BufferedImage image = ImageIO.read(new File(this.getClass().getClassLoader().getResource(string).getFile()));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", byteArrayOutputStream);
byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array();
outToClient.write(size);
outToClient.write(byteArrayOutputStream.toByteArray());
outToClient.flush();
outToClient.close();
} catch(IOException e) {
System.out.println("Exception is " + e);
}
break;
}
}
В первом случае (HTTP
) это работает, но когда браузер запрашивает отсутствующие изображения, то при попытке отправить изображения я получаю две ошибки.
Exception is java.net.SocketException: Software caused connection abort: socket write error
Exception is java.net.SocketException: Connection reset by peer: socket write error
Я перепробовал много альтернативных способов отправки данных клиенту, но он не работает.
Это основной цикл кода:
`
public static void main(String [] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(80);
ExecutorService executor = Executors.newFixedThreadPool(100);
CommandExecutor command = new CommandExecutor();
Socket connection;
while(true) {
connection = serverSocket.accept();
connection.setKeepAlive(true);
if(connection != null) {
executor.submit(new Server(connection,command));
}
}
}
`
Есть еще одна проблема, может быть, она может решить эту проблему. Когда я отправляю html-страницу, то при первой попытке браузер не распознает ее и просто отображает html-текст, а не отформатированную страницу, однако при обновлении браузер отображает отформатированную страницу.
Здесь я получил небольшое объяснение, но я не знаю, полезно ли это, потому что я поддерживаю связь.