чат java веб-сервер, http частичный ответ - PullRequest
1 голос
/ 07 декабря 2011

Я пытаюсь сделать веб-чат для интеграции с другими языками. Я готов создать свой собственный веб-сервер в Java ..., который знает только для ответа на конкретный запрос.

У меня есть сокет, который прослушивает порт 80. отвечая на

out.print("HTTP/1.1 200 OK\r\n");
out.print("Content-Type: text/plain\r\n\r\n");

out.println("We have a text now");

out.print("\r\n");
out.print("\r\n");
out.print("0");
out.print("\r\n");
out.print("\r\n");

Моя проблема ... есть ли способ использовать частичный ответ, чтобы оставить сокет браузера открытым?

Я хочу отправлять сообщения только тогда, когда они существуют .. в этом случае сообщения будут отправляться практически мгновенно ..

P.S .: Я не говорю о веб-сокетах, потому что не все программы поддерживают веб-сокеты ... только браузеры ... (программы, которые не поддерживают веб-сокеты: Internet Explorer)

У меня вопрос: могу ли я использовать частичный ответ (206) в этом случае ... и как сохранить загрузку страницы, а также отправить частичный текст ... ?? ... Должен ли я сказать, что длина содержимого или что-то? какой заголовок мне нужно написать ... Я знаю только для нескольких статусов (200, 301, 404 и т. д.). Для 206 я не знаю, что написать в первой, второй, третьей строке ... как отправить ответ (в формате xml, текст или я могу определить тип содержимого?) И как прочитать его из JavaScript?

Например, я хочу, чтобы этот код записывал каждую секунду что-то:

out.print("HTTP/1.1 200 OK\r\n");
out.print("Content-Type: text/plain\r\n\r\n");

for (int i = 0; i < 10; i++)
{
    out.println("We have a text now");
    try
    {
        Thread.sleep(1000);
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }

}

out.print("\r\n");
out.print("\r\n");
out.print("0");
out.print("\r\n");
out.print("\r\n");

Привет

Ответы [ 3 ]

1 голос
/ 07 декабря 2011

Этот код «держит сокет браузера открытым»:

out.print("Connection:keep-alive \r\n");

Но помните, что браузеру все еще может потребоваться опрос для получения нового текста.

1 голос
/ 07 декабря 2011

Любой приличный http-клиент будет использовать http keep-alives, поэтому, если пользователь через несколько секунд снова сделает запрос, ему не нужно будет открывать новое соединение.Если вы пишете свой собственный веб-сервер, вы должны будете убедиться, что это будет реализовано, иначе реализация будет медленнее, чем стандартный веб-сервер или веб-контейнер (например, tomcat или jetty).Кроме того, поскольку во многих языках есть хорошие библиотеки http, для этого вам также не требуется настраиваемая реализация веб-сервера.

Если вы написали сервлет, то можно просто никогда не возвращаться с httpответ, а затем просто написать ответы, как они приходят.Это будет связывать потоки на сервере и, вероятно, не будет хорошо масштабироваться.

Вы можете попробовать одну из асинхронных реализаций http (например, netty или mina) и попробовать, но это значительно больше работы - хотя это все равно будет гораздо меньше работы, чем попытка накатить свою собственную.

0 голосов
/ 15 мая 2012

Не возражайте против поддержки активности или других заголовков.Просто подождите разумную сумму в вашем веб-сервисе, выполнив проверку изменений и sleep () s.

Я использую 10..20 sec sleep в моем PHP-коде, и это работает.(Максимальное время выполнения сценария PHP по умолчанию составляет 30 секунд, поэтому для него не требуется конфигурация Apache / PHP.) Также я использую 4,5-секундный сон в своем коде сервера C / C ++, просто «потому что я могу», мой простой C ++Поток ответов веб-сервера потребляет гораздо меньше ресурсов, чем поток / процесс веб-сервера PHP (независимо от того, что именно).

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

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