Сохранение постоянных соединений с домашнего Java-сервера - PullRequest
3 голосов
/ 09 ноября 2011

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

На данный момент он выполняет несколько действий, таких как предварительный просмотр каталогов, пересылает их в index.html, если каталог содержит его, отправляет заголовок Last-Modified и правильно отвечает на запрос If-Modifed-Since клиента.

Теперь мне нужно, чтобы моя программа принимала постоянные соединения. В данный момент он имеет резьбу, поэтому каждое соединение имеет свой собственный поток. Я хочу поместить весь свой код потока в цикл, который продолжается до Connection: close или до указанного времени ожидания.

У кого-нибудь есть идеи, с чего начать?

Редактировать: Это университетский проект, и он должен быть выполнен без использования Frameworks.

У меня есть метод main, который зацикливается бесконечно, каждый раз, когда он зацикливается, он создает объект Socket, затем создается объект HTTPThread (класс моего собственного создания), который обрабатывает один запрос.

Я хочу разрешить нескольким запросам работать в одном соединении, используя заголовок запроса Connection: keep-alive. Я ожидаю использовать цикл в моем HTTPThread классе, я просто не знаю, как передать несколько запросов.

Заранее спасибо:)

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Я предполагаю, что вы реализуете код протокола HTTP самостоятельно, начиная с Socket API. И что вы реализуете часть постоянных соединений спецификации HTTP.

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


Я хотел бы отметить, что есть намного более простые способы реализации веб-сервера. Существует множество существующих инфраструктур веб-серверов Java и серверов приложений, или вы можете использовать стеки протоколов Apache HTTP.

0 голосов
/ 09 ноября 2011

Несколько идей для начала:

Эта статья в Википедии описывает постоянные соединения HTTP 1.1:

http://en.wikipedia.org/wiki/HTTP_persistent_connection

Вы не хотите закрывать сокет, но после некоторого неактивного периода времени (apache 2.2 использует 5 секунд) вы хотите закрыть его.

У вас есть два способа реализации:

  1. в вашем потоке не закрывайте сокет и не выходите из потока, а вместо этого установите таймаут чтения в сокет (все, что вы хотите поддерживать). Когда вы вызываете read, он блокируется, и если время ожидания истекает, вы закрываете сокет, иначе вы читаете следующий запрос. Недостатком этого является то, что каждое постоянное соединение содержит как поток, так и сокет для любого максимального периода ожидания. Это означает, что ваше решение не масштабируется, потому что вы держите потоки слишком долго (но может подойти для целей школьного проекта)!

  2. Вы можете обойти ограничение (1), поддерживая список кортежей {socket, timestamp}, имея фоновый монитор потока и закрывая соединения с истечением времени ожидания, и используя NIO для обнаружения нового чтения в существующем открытая розетка. Поэтому после того, как вы закончите читать начальный запрос, вы просто выходите из потока (возвращая его в пул потоков). Очевидно, что это намного сложнее, но имеет преимущество, заключающееся в освобождении потоков запросов.

0 голосов
/ 09 ноября 2011
  1. Если он должен работать как веб-служба: откройте 2 сокета со стороны клиента, один для запросов, один для ответов.Держите сокеты и потоки открытыми.

    Вам необходимо определить разделитель, чтобы уведомить другую сторону, что передача завершена.Специальная битовая строка для двоичного файла, специальный символ (обычно новая строка) для текстового протокола (например, XML).

  2. Если вы действительно пытаетесь реализовать собственный http-сервер, вам лучшеиспользовать библиотеку , которая уже реализует стандарт HTTP 1.1 keep -iveal.
...