Это сложно отладить без остальной части кода, поэтому я собираюсь опубликовать свой первый и немного поэкспериментировать. Почему вы вызываете .reset () в своих потоках? Это переместит позицию чтения в потоке обратно в начало, а это не то, что вы хотите, я бы подумал (никогда не использовал ObjectInputStream).
ОК, я взял ваш код и взломал некоторые мелочи, чтобы он скомпилировался, и он работал для меня с помощью .reset (). Похоже, то, что вы делали, правильно.
Не думаю, что смогу помочь больше без остального кода. К сожалению.
PS: Я предполагаю, что у вас есть вещи Serializable, реализующие Runnable и т. Д., Которых у кода, который вы опубликовали, не было. Но если бы вы не настроили эти вещи, то ваш код не скомпилировался бы в первую очередь.
После 45 минут работы с вашим кодом, я не могу допустить ошибку. Мне пришлось взломать несколько вещей здесь и там, чтобы заставить его работать (так как в нем отсутствовал один или два класса и часть кода выше), но я не думаю, что изменил это (сильно). Я не уверен, что мои изменения повлияют на что-либо, это немного сложно понять.
У меня есть два предположения о том, что происходит. Первым снова будет объект .reset (). Если вы не прокомментировали это и посмотрите, имеет ли это какое-то значение.
Так что с этим проигнорированным, я собираюсь сделать другой удар в том, что здесь происходит.
java.io.StreamCorruptedException: invalid type code: 00
Я собираюсь догадаться, что 00 может быть подсказкой. Насколько я понимаю, должен быть отправлен байт сигнатуры (как доказательство того, что объект - это то, что вы говорите, поэтому строки не интерпретируются как double или PacManGameUIs), и, очевидно, Java недоволен, потому что это неправильно.
Но почему 00? Это интересная ценность. Мое предположение (и это большое предположение) состоит в том, что это первый байт целого числа (то есть 4 байта при отправке с ObjectOutputStream.writeInt ()). Возможно, вам отправляется целое число, которое не читается до вызова .readObject во входном потоке? Я не уверен, что это может привести к ошибке, но это было бы моим лучшим предположением.
В такой ситуации есть две вещи, которые нужно сделать. Первое - это срубить вещи. Создайте два маленьких файла классов, которые ничего не делают, кроме запуска потоков, которые обмениваются друг с другом в сокращенном виде (без всего управления игрой), но используя тот же поток и логику. Посмотрите, сможете ли вы воссоздать ошибку там.
Другой способ (и это будет более поучительно, если вы осмелитесь) - прослушать разговор между двумя половинками программы, используя что-то вроде WireShark или tcpdump . Это позволит вам увидеть необработанные байты, через которые вы отправляете. Хотя это может быть запутанным и трудным для интерпретации, оно должно помочь понять, отправляете ли вы неправильный объект легко. Отправка int, вероятно, займет около 4 байтов, но отправка большой структуры потребует больше. Экспериментируя, вы сможете понять это. Это боль, но она даст вам знать точно что отправляется.
Может быть трудно отследить интерфейс обратной связи (когда компьютер общается с самим собой), по крайней мере, в Windows с WireShark (я не помню, чтобы это было так просто), поэтому часто проще всего сделать это с двумя компьютеры (один как сервер, один как клиент), так что вы можете легко заглядывать в пакеты.
Снова извините, что не могу быть более полезным.