Java-сокет отправка и получение
С незапамятных времен я думаю о том, как мне использовать Java Sockets для отправки и получения данных. Я надеюсь, что вы можете помочь мне найти хороший способ сделать это.
Я построил структуру Сервер / Клиент, где клиент подключается к серверу и получает свой собственный поток, обрабатывающий метод запрос-ответ. Информация заключена в XML.
Сначала сервер запускает чтение блокирующего сокета. Сначала я использую writeInt(), где передается длина XML-сообщения. После этого Сервер считывает количество байтов длины и анализирует сообщение. После передачи клиент переходит в состояние приема и ожидает ответа.
Это нормально, но после того, как клиент аутентифицируется, сервер ждет, что придет и заблокируется.
Но что мне делать, если на сервере нет информации, которую нужно передавать. Я мог бы попытаться уничтожить блокировку чтения и отправить сообщение клиенту. Но что произойдет, если клиент придет в голову, что у него тоже есть сообщение и тоже начинается отправка. В этот момент никто не будет слушать.
Для этого, возможно, я мог бы использовать какой-то буфер, но у меня такое ощущение, что я не должен идти этим путем.
Я долго искал и нашел интересную информацию, но плохо ее понял. К сожалению, моя книга только об этой простой модели сокетов.
Может быть, я должен использовать две темы. Одна отправка и одна получение. На сервере есть база данных, в которой хранятся сообщения и которые ожидают передачи. Поэтому, когда сервер получает сообщение, он сохраняет это сообщение в базе данных, а также ответ типа "сообщение получен" будет храниться в базе данных. Поток отправителя будет искать новые сообщения и отправлять клиенту сообщение "получено". Такой подход не будет посылать ответ в миллисекундах, но я могу представить, что он будет работать хорошо.
Я надеюсь, что я дал вам достаточно информации о том, что я пытаюсь. Что бы вы мне посоветовали, как реализовать это общение?
Спасибо
1 ответ
Но что мне делать, когда на сервере теперь есть информация, которую нужно передать.
Я бы делал записи с сервера синхронизированными. Это позволит вам отвечать на запросы в одном потоке, а также отправлять другие сообщения в соответствии с требованиями другого потока. Для клиента вы можете иметь отдельный поток, делающий получение.
Более простая модель может иметь два гнезда. Один сокет работает так же, как и сейчас, и при входе в систему клиенту отправляется уникальный идентификатор. В этот момент клиент открывает второе соединение с выделенным потоком для прослушивания асинхронных событий. Он передает уникальный идентификатор, чтобы сервер знал, для какого клиента предназначены асинхронные сообщения.
Это даст вам простой синхронный шаблон, как у вас сейчас и простой асинхронный шаблон. Единственный недостаток - у вас есть два сокетных соединения, и вы должны их координировать.