Является ли dataInputStream Socket знать, как работать с несколькими записями в нем? - PullRequest
0 голосов
/ 18 октября 2011

Я разрабатываю сетевую игру, в целом:

У меня есть сервер, который запускает serverThread для каждого подключенного к нему клиента.
Его цель - прослушивать сообщения от конкретного клиента.и обработать его на сервере.
Кроме того, для каждого открытого клиента запустите clientThread, который является потоком прослушивания сообщений от сервера.
Два потока - это довольно простые и похожие потоки, которые реализуют интерфейс Runnable.и, следовательно, переопределяют метод run.
Каждый метод Run является своего рода бесконечным циклом, который имеет при запуске команду (блокирующую команду):

int command = m_In.readInt ();

, а затем выполнить процесс путем переключения структуры дел над полученной командой.
после завершения процесса, цикл заставляет код вернуться к блокировке m_In.readInt ()
Чтобы дождаться прихода другой команды.

У меня такой вопрос: в моей сетевой игре достаточно опций, которые используют связь через этот m_In, так что же произойдет, если два или более сообщения почти объединятся в clientThread, как будет действовать dataInputStream?
Начнет ли оно обрабатывать первое сообщение, а после его завершения захватит второе, которое находится в какой-то очереди?или оно может отбросить второе сообщение и оно будет потеряно?Может быть, этот поток имеет буфер, поэтому он хранит второе сообщение в очереди или что-то?

Спасибо

1 Ответ

1 голос
/ 18 октября 2011

Потоки по своей природе ожидают поступления данных в указанном порядке. Если у вас есть два потока, одновременно записывающих в один и тот же поток, произойдут плохие вещи.

Теперь вы, безусловно, можете синхронизировать доступ к потоку и сделать так, чтобы два потока чередовали свои записи (если вы создаете какое-то форматирование в потоке, которое сообщает получателю, как читать данные), но вы этого не получите по умолчанию.

Обычно каждый клиентский поток имеет свое собственное соединение и, следовательно, свой собственный поток для записи. Очевидно, что сервер может читать из нескольких потоков одновременно, и это обычный шаблон сервера.

...