Почему сокет java сообщает об ошибке, если он не считывает все данные - PullRequest
0 голосов
/ 06 мая 2020

Недавно я учился писать простой HTTP-сервер, потому что функция очень проста, пока пользовательский доступ будет реагировать на изображение. Итак, я решил не читать данные запроса пользователя (потому что они мне не нужны), но когда я использовал свой браузер для доступа к localhost: 10000, возникла проблема - изображение не могло отображаться полностью, и я не мог Не скачиваю. Однако, когда я прочитаю запрос пользователя, он будет работать нормально. Если я прочитаю только часть данных запроса, программа не будет работать должным образом.

Вот мой упрощенный код.

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;
import java.nio.file.Files;

public class Server {
    public static void main(String[] args) throws IOException {
        try (ServerSocket server = new ServerSocket(10000)) {
            while (true) {
                Socket client = server.accept();
                System.out.println("user connecting。。。");

                OutputStream out = new BufferedOutputStream(client.getOutputStream());
//              InputStream in = new BufferedInputStream(client.getInputStream());
//              StringBuilder request = new StringBuilder(80);
//              while (true) {
//                  int c = in.read();
//                  if (c == '\r' || c == '\n' || c == -1) break;
//                  request.append((char)c);
//              }
                File file = new File("D:/DragonFile/target/attitude.jpg");
                long length = file.length();
                byte[] data = Files.readAllBytes(file.toPath());

                String header = "HTTP/1.0 200 OK\r\n" 
                        + "Server: crazy\r\n"
                        + "ContentType-length: " + length + "\r\n"
                        + "Content-Type: " + "image/jpg" + "; charset=" + "UTF-8" + "\r\n\r\n";

                out.write(header.getBytes(Charset.forName("UTF-8")));  //response header
                out.write(data);       //response body
                out.flush();        // flush the stream
                client.close();
            }
        }
    }
}

Запустите этот код и используйте браузер для доступа к localhost: 10000, и изображение будет отображаться, но в этой программе есть ошибка.

enter image description here

Когда я отменяю часть комментария выше, код может работать нормально, и это нормально для доступ к картинкам.

Вот картинка нормального доступа. enter image description here

Это мой первый вопрос, помогите, пожалуйста, и скажите почему. Мне это интересно.

1 Ответ

0 голосов
/ 06 мая 2020

Подумайте о сокете как о двух str aws (один в одном направлении, а другой в другом). Если вы положите что-то в соломинку, а другая сторона не вытащит это, вы заметите и не сможете положить в нее что-то еще.

HTTP определяется как «Клиент помещает свой запрос в , сервер читает его, а затем помещает ответ в другую соломинку ".

Не взяв все с соломинки, вы нарушили контракт, и браузеру это не нравится.

Фактически браузер заметит, что ваш сервер даже не принимает запрос (даже если он короткий), и совершенно справедливо предполагает, что если запрос даже не прочитан, то ответ не может быть хорошим.

Упс, я случайно ELI5-ed это ... ну оставлю как есть.

...