Могут ли Java ServerSocket и Sockets, использующие ObjectIOStreams, потерять пакеты? - PullRequest
1 голос
/ 27 апреля 2010

Я использую ServerSocket на моем сервере и сокеты, которые используют ObjectIOStreams для отправки сериализуемых объектов по сетевому соединению. Я разрабатываю существенно более финансовую версию монополии, и, таким образом, пакеты отправляются и подтверждаются как отправленные / полученные. Нужно ли мне реализовать свой собственный наблюдатель потери пакетов или об этом уже позаботились с (серверными) сокетами?

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

http://code.google.com/p/inequity/source/browse/#svn/trunk/src/network Код можно найти в сети-> ClientController и сети-> Сервер

1 Ответ

4 голосов
/ 27 апреля 2010

Теоретически; да. Нет никакого способа дать 100% -ную теоретическую гарантию того, что то, что отправлено на аппаратном уровне, получено таким же образом на принимающей стороне.

Практически, однако, если вы используете TCP (Transmission Control Protocol), об этом уже позаботились; Вы не потеряете ни одного пакета. (Если вы используете UDP с другой стороны (протокол пользовательских дейтаграмм), это другая история, и вполне вероятно, что вы теряете пакеты или получаете их не по порядку).

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

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

...