(Отредактировано, чтобы ответить на комментарий)
Попробуйте объявить элемент сокета как transient
, как в
private transient Socket socket;
Это предотвратит попытку механизма сериализации отправить значение socket
. Обратите внимание, что вы не можете осмысленно отправлять объекты, содержащие значения, которые представляют ресурсы ОС, такие как дескрипторы сокетов, другому процессу. В лучшем случае любая попытка использовать такой объект на принимающей стороне приведет к возникновению исключения. В худшем случае такая попытка может привести к скрытым ошибкам (данные отправляются не тому пользователю). По этой причине такие объекты никогда не сериализуются (кроме случаев, когда кто-то допустил ошибку).
Рассмотрим следующий (упрощенный) пример: в UNIX сокет представлен целым числом (так называемый файловый дескриптор), которое возвращается ОС при создании сокета. Если это значение отправляется другому процессу, нет никаких гарантий, что это число действительно относится к действительному дескриптору файла, открытому в принимающем процессе. Хуже того, если в процессе-получателе есть дескриптор файла с таким же числовым значением, почти невозможно сослаться на тот же сокет, открытый в процессе-отправителе. Таким образом, если число фактически используется в качестве дескриптора файла в процессе приема при отправке данных, оно почти наверняка попадет куда угодно, кроме предполагаемого места назначения.
Если отправляющий и принимающий процессы находятся на одном компьютере, существуют способы передачи "сокета" от одного процесса к другому. Но я сомневаюсь, что есть простые способы доступа к этим вызовам ОС из Java.
person
Dirk
schedule
04.02.2011
currentPlayer
- person Bozho   schedule 04.02.2011