Я программирую песочницу на базе клиент-сервер, и есть странная ошибка: Сервер сохраняет все объекты в ArrayList, включая игроков. Он также сохраняет ArrayList, который содержит только игроков, которые также включены в Entity-ArrayList. Для каждого тика и каждого игрока сервер отправляет позицию игрока, список всех сущностей и команду для клика на основе клиента. Я использую Object-Output и -InputStreams для передачи. Сообщения, которые посылают на сервер, смотрят как это:Java Object-Stream: Объекты «меняются» во время передачи
-> STPOS:{[email protected]} y-coord is 75.25017862499999, I already checked
-> SDENT:{[[email protected]]} y-coord is 75.25017862499999
-> CLTICK
Клиент-вход кажется, что это:
<- STPOS: {[email protected]} y-coord is 75.25017862499999
<- SDENT: {[[email protected]]} y-coord is 60.00158922
<- CLTICK
Таким образом, координатные «магически» меняется.
Сервер-выход ArrayList работает следующим образом: (из: ObjectOutputStream, объекты: ArrayList, Entity и ProtocolClass мои собственные классы)
out.writeObject(new ProtocolClass(PROTOCOL.sendEntities, entities));
Клиент-сторонний вход следующим образом: (в: ObjectInputStream)
ProtocolClass pc = (ProtocolClass) in.readObject();
[...]
[if pc.protocol equals PROTOCOL.sendEntities]
entities = (ArrayList<Entity>) pc.object;
Координата y в начале составляет «60» и увеличивается, когда игрок падает на землю. 75.25 ... это координата, которую он имеет, когда он касается земли. 60.0015 ... - первая переданная новая y-координата. Таким образом, он работает для первого тика. Но это не так все время, часто оно остается на уровне 60.
Существует только один поток, использующий один поток, так что потоки не называются асинхронно. Все «Запросы» сохраняются в очереди. Я просмотрел весь проект, но он действительно отправляет только «SDENT» -Query после галочки.
Я понятия не имею, почему это происходит. Передача переданных объектов в ArrayList вызывает предупреждение в Eclipse: «Unchecked cast». В других случаях объектов литья это не так. Только литье в ArrayList не имеет значения.
спасибо, сохранен мой день! – Andreas