Сброс соединения одноранговым и программным обеспечением вызывает разрыв соединения - PullRequest
0 голосов
/ 08 марта 2019

У меня есть два случая, когда я получаю запросы из браузера и возвращаю ресурсы или 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-текст, а не отформатированную страницу, однако при обновлении браузер отображает отформатированную страницу.

Здесь я получил небольшое объяснение, но я не знаю, полезно ли это, потому что я поддерживаю связь.

...