Разговор клиент / сервер - я делаю это неправильно? - PullRequest
1 голос
/ 09 августа 2011

У меня есть клиент-серверное приложение, которое я сделал с использованием сокетов. Дело в том, что когда я посылаю команду, запрашивающую некоторую информацию, и жду ответа, я блокирую, пока не придет ответ. Это затрудняет реализацию двунаправленных запросов / ответов. Позвольте мне объяснить, используя один пример: Клиент может перечислять файлы в каталоге сервера, поэтому я делаю что-то подобное в коде:

Код клиента: 1- Отправить запрос команды: LS / 2- Блоки, ожидающие ответа LS. 3- Получить список файлов.

Причина, по которой я это сделал, заключается в том, что Клиент может передавать файл, поэтому я делаю: 1- Отправьте запрос на передачу файла. 2- Блокирует чтение (), ожидая, если сервер принимает 3- Только если это так, отправьте файл.

Так что все было хорошо, пока мне не пришлось добавить серверу возможность запрашивать что-либо. В моем коде клиент может запросить что угодно и получить блокировку в ожидании ответа. Затем сервер может отправить любую команду запроса, которая не будет иметь смысла для ответа, которого ожидает клиент. Это могло бы испортить разговор.

Одно из решений, которое я принял, - никогда не блокировать ответ. Я отправляю команду запроса, а затем возвращаюсь, чтобы дождаться ЛЮБОГО запроса или ответа от сервера. Если ответ приходит, я отправляю файл. Так что дело в том, нужно ли мне добавлять идентификаторы в каждой паре запрос / ответ, чтобы знать, какой ответ на какой запрос?

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

PS2: простите мой плохой английский;)

1 Ответ

0 голосов
/ 09 августа 2011

То, что вы ищете, это уровень приложения protocol между сервером и клиентами.

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

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

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