Двунаправленная связь с 1 розеткой - как иметь дело с столкновениями?

StackOverflow https://stackoverflow.com/questions/2687719

Вопрос

У меня есть одно приложение. Это состоит из «менеджера» и «рабочего». В настоящее время работник всегда инициирует связь, говорит что-то менеджеру, и менеджер отправит ответ.

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

Тем не менее, я немного запутался как о том, как бороться с «столкновениями». Скажем, менеджер решает сказать что-то рабочему, и в то же время работник решает что-то сказать менеджеру. Что случится? Как должна быть обработана такая ситуация?

PS Я планирую использовать Netty для фактической реализации.

Это было полезно?

Решение

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

Простой ответ. Не делать.

Узнайте из существующих протоколов: у клиента и сервера. Все будет работать хорошо. Работник может быть сервером, а менеджер может быть клиентом. Менеджер может сделать многочисленные запросы. Работник отвечает на запросы, когда они прибывают.

Однокомпенсация может быть сложным без реальной ценности для сложности.

Другие советы

Я бы пошел на постоянный двунаправленный канал между сервером и клиентом.

Если все, что у тебя будет, это один сервер и один Клиент, то нет проблем с столкновением ... Если сервер принимает соединение, он знает, что это клиент и наоборот. Оба могут читать и писать на одном розетке.

Теперь, если у вас есть несколько клиентов, и ваш сервер должен отправить запрос специально для клиента X, то вам нужно подтверждение связи!

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

Отдается вам, я только что написал учебник (образец проекта включен) на эту точную проблему. Используя Netty! :)

Вот ссылка: http://bruno.linker45.eu/2010/07/15/handshaking-tutorial-with-netty/

Обратите внимание, что в этом решении сервер не попытаться подключиться к клиенту. Это всегда клиент, который подключается к серверу. Если вы думали о открытии сокета каждый раз, когда вы хотите отправить сообщение, вы должны пересмотреть постоянные соединения, поскольку они избегают накладных расходов установления соединения, следовательно, ускоряя скорость передачи данных N-Fold.

Я думаю, что вам нужно прочитать на розетках ....

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

Правильная ссылка на рукопожатие / учебное пособие, упомянутое в ответе Бруноквельхо http://bruno.factor45.org/blag/2010/07/15/15/60-tutorial-with-netty/
Я бы добавил это как комментарий к его вопросу, но у меня нет минимальной необходимой репутации.

Если вы хотите изобретать колесо и не хотите использовать промежуточное ПО ...

Разработайте свой протокол, чтобы ответы на другие просьбы на ваши запросы всегда легко различимы от запросов от другого сверстника. Затем выберите стратегию вашей сети ввода / вывода. Какой бы код не отвечает за чтение из сокета, должен сначала определить, является ли входящие данные ответом на данные, которые были отправлены, или если это новый запрос от однорангового режима (глядя на заголовок данных, а также ли вы выдали запрос совсем недавно). Кроме того, вам необходимо поддерживать правильные очередь, чтобы при отправке ответов на запросы PEER она правильно разделена от новых запросов, которые вы выпускаете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top