Знает ли DataInputStream сокета, как обрабатывать несколько записей в него?

#java #sockets #datainputstream

#java #сокеты #datainputstream

Вопрос:

В общем, я разрабатываю сетевую игру:

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

команда int = m_In.readInt();

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

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

Спасибо

Ответ №1:

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

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

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

Комментарии:

1. хорошо, но вернемся к моему вопросу: если я отправил сообщение из клиентского потока на сервер и одновременно получил ответ на клиенте с другим сообщением от сервера клиенту. (При обработке первого сообщения — перед возвратом к readInt) Верно ли, что после повторного возврата к readInt он получит второе сообщение, которое уже было отправлено тем временем?

2. tcp (потоки) не будут отбрасывать сообщения. Они буферизуются для вас и будут доступны, когда вам нужно выполнить чтение определенного типа.