Простая ошибка сервера Java - PullRequest
0 голосов
/ 12 февраля 2012

Несколько часов назад я начал изучать java-сокеты. Теперь я пытаюсь заставить серверное приложение возвращать мне данные в веб-браузер. Мой код:

try{
    ServerSocket socket = new ServerSocket(80);
    Socket response = socket.accept();
    String lol = "<html>hi</html>";
    OutputStream str = response.getOutputStream();
    str.write(lol.getBytes("US-ASCII"));
    str.flush();
    response.close();
    System.out.println("LOL works!");
    }catch(IOException ex)
    {
        System.out.println(ex.toString());
    }
}

У меня нет ошибки в серверном приложении, сообщение "LOL работает !!!" печатает в консоли, но в веб-браузере я получаю эту ошибку:

My error.

Кто-нибудь знает, как его починить и получить текст "привет" в веб-браузере? Спасибо.

EDIT: Я пытался добавить его в Telnet. Это результат: Telnet result

Ответы [ 4 ]

2 голосов
/ 12 февраля 2012

Вы не можете просто отправить необработанные данные в браузер и ожидать, что они их обработают - вы должны следовать HTTP (протокол), который описан в RFC1945 .

В частности, вы должны отправить несколько заголовков, а затем сначала новую строку, как описано в Разделе 4.1 RFC1945.

try{
    ServerSocket socket = new ServerSocket(80);
    Socket response = socket.accept();
    String lol = "<html>hi</html>";
    writer = new PrintStream(response.getOutputStream());
    writer.println("HTTP/1.1 200 OK");
    writer.println("Content-Type: text/html");
    writer.println();
    writer.println(lol);
    writer.flush();
    response.close();
    System.out.println("LOL works!");
    }catch(IOException e)
    {
        e.printStackTrace();
    }
}

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

0 голосов
/ 12 февраля 2012

Помимо неправильной отправки ответа, как указал Кристиан Антонсен, проблема, скорее всего, заключается в том, что вы на самом деле не ждете и не читаете запрос, прежде чем ответить. Возможно, это не должно быть проблемой из-за буферизации, но даже в этом случае вполне вероятно, что ваш сервер просто «слишком быстр», отправляя ответ и закрывая сокет до того, как Chrome сможет отправить запрос, вызывая, таким образом, «соединение». Сброс "проблема, которую он сообщает.

Попробуйте реализовать сервер, который немного более полон. Вот простой пример:

public void readRequest(Socket client) throws IOException {
    Reader raw = new InputStreamReader(client.getInputStream(), "US-ASCII");
    BufferedReader reader = new BufferedReader(raw);
    while(true) {
        String line = reader.readLine().trim();
        if(line.equals(""))
            break;
    }
}

public void writeResponse(Socket client) throws IOException {
    String lol = "<html>hi</html>";
    PrintStream writer = new PrintStream(client.getOutputStream());
    writer.println("HTTP/1.1 200 OK");
    writer.println("Content-Type: text/html");
    writer.println();
    writer.println(lol);
    writer.flush();
}

public void serveClient(Socket client) throws IOException {
    try {
        readRequest(client);
        writeResponse(client);
        System.out.println("LOL works!");
    } finally {
        client.close()
    }
}

public void serve() {
    try{
        ServerSocket socket = new ServerSocket(80);
        while(true) {
            Socket client = socket.accept();
            serveClient(client);
        }
    }catch(IOException e) {
        e.printStackTrace();
    }
}

(Обратите внимание, что я не пробовал код или что-то еще, поэтому нет гарантии, что он будет скомпилирован как есть.)

0 голосов
/ 12 февраля 2012

Похоже, проблема с Chrome. Может быть этот?

Попробуйте поиграться с настройками IPv6.

0 голосов
/ 12 февраля 2012

Веб-браузер обменивается данными с веб-сервером по протоколу HTTP . Ваш сервер должен ответить на запрос браузера в соответствии с этим протоколом, если вы хотите, чтобы браузер правильно отображал страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...