Предполагалось, что это будет 5-минутный тест, чтобы увидеть, работает ли он так, как было предложено. Я хотел создать глупо простой HTTP-сервер, который ничего не делает, кроме как распечатывать то, что получает (а именно HTTP-запросы).Сокет Java: Чтение не возвращается
public static void main(String args[]) throws IOException {
ServerSocket server = new ServerSocket(port);
try (Socket socket = server.accept()) {
DataInputStream input = new DataInputStream(socket.getInputStream());
String received = input.readUTF();
System.out.println("Received: \n" + received);
}
}
Но я пришел со следующей проблемой: Когда я начинаю свою программу, а затем попробовать http://localhost/ в Firefox, поток застревает в методе readUTF(). Он просто не возвращается.
Я пробовал то же самое с сокетными каналами и размером буфера 128. Там он застревает после третьего чтения (так где-то между 384 и 511-м байтами). Это следующий код:
public static void main(String args[]) throws IOException {
CharsetDecoder decoder = Charset.forName("UTF8").newDecoder();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(port));
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
buffer.clear();
SocketChannel socketChannel = serverSocketChannel.accept();
StringBuilder received = new StringBuilder();
while (socketChannel.read(buffer) > 0) {
buffer.position(0);
received.append(decoder.decode(buffer).toString());
buffer.clear();
}
System.out.println("Received: \n" + received.toString());
}
Оба они показывают то же поведение, что метод чтения не заканчивается. Есть ли у вас какие-либо идеи, как решить эту проблему и, в частности, в чем причина такого поведения?
Я не видел код, который записывает данные в Socket. Можете ли вы опубликовать эту часть кода? –
Это делается браузером. Как я уже упоминал выше, этот код прослушивает порт 80 (HTTP-сервер), и поэтому он подключается к браузеру, когда я запрашиваю 'http: // localhost'. Соединение работает нормально, и во втором примере я могу читать 384 байта (цикл 3x) до тех пор, пока чтение не застрянет. Но HTTP GET-сообщение длиннее 384 байт. Похоже, что в четвертом цикле он не признает, что данные уже закончены, и он ждет больше. Но, тем не менее, он должен возвращать и сохранять оставшиеся данные в буфер. – Green