2015-09-29 8 views
1

Я разрабатываю агент, который подключает клиента к платформе (серверу). агент основан на гризли-каркасе. Мой агент получает запрос от моего клиента, чтобы зарегистрировать его на платформе. Поэтому мой агент выполнит эту операцию. Тогда мой агент будет ждать операций, поступающих с платформы, и будет уведомлять клиента об этих операциях. Таким образом, связь между моим агентом и клиентом будет сохранена. Если с платформы появится новая операция, я сделаю серверный клик клиенту, так как мой клиент будет подключен ко мне. Я не хочу, чтобы клиент отправлял запросы на новые операции, поступающие с платформы (опрос). Я хочу, чтобы мой агент толкал операцию (POST-запрос) моему клиенту. Я знаю, что этот сервер-push отличается от клиент-серверной модели, но я слышал, что можно использовать гризли.Может ли гризли делать сервер-push, а соединение поддерживается клиенту?

до сих пор, я нашел что-то полезное для реализации этой идеи в Java. Эта ссылка https://grizzly.java.net/spdy.html от grizzly описывает push-сервер, но этот сервер-push не применим для моего случая, поскольку push-сервер выполняется, когда http-запрос поступает от клиента.

Возможно ли реализовать эту идею с использованием гризли?

если да, как это сделать?

Редактировать 1: Я заметил еще одну проблему при использовании http-сервера grizzly-framework. Мой агент состоит в моем случае из двух сторон: серверная сторона, которая получает запросы от клиента и клиентская сторона, которая подключается к платформе. Мой агент получит запрос от клиента. Агент на основе гризли запустит http-обработчик (мой клиент-агент), который анализирует этот запрос. После анализа запроса этот обработчик подключится к платформе. По завершении операции он отправит клиенту http/1.1 200 OK. Если тот же клиент решил отправить мне новую операцию на платформе, я должен начать новое подключение к платформе, что означает для меня создать экземпляр нового клиентского агента (http-handler) для того же клиента. Я имею в виду, что у меня нет доступа к старому экземпляру (старый клиентский агент), и я обязан создать новый экземпляр, что подразумевает большой трафик, который мне нужно избежать. В этом разделе, если обработчик выполняет свою неблокирующую операцию, этот обработчик теряется, поэтому я не могу получить к нему доступ, что означает, что я не могу получить операции с платформы и сделать серверный push. Если я приостановил обработчик на определенный период времени, все поступившие запросы от других клиентов будут заблокированы, поэтому клиенты не смогут обслуживаться.

ответ

0

IMO SPDY или HTTP/2 не очень хорошо вписывается в то, что вам нужно, поскольку, поскольку вы справедливо отметили, что push, который они отправляют, всегда должны быть связаны с первоначальным запросом «клиент-сервер». Я бы предложил взглянуть на WebSocket [1], [2].

[1] https://grizzly.java.net/websockets.html [2] https://tyrus.java.net/

+0

Хорошо, я никогда не использовали WebSockets. Мы предполагаем, что мой агент использует протокол websocket. Должны ли мои клиенты использовать этот протокол? – amitakCs

+0

Да, websocket в настоящее время поддерживается веб-браузерами и многими клиентами HTTP/websocket. – alexey