Мой ObjectOutputStream не работает должным образом - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь сделать многопользовательскую игру с Java, и я застрял с отправкой объектов через поток объектов и получая его должным образом. С сервера я отправляю объект Snake и Apple клиенту, используя ObjectOutputStream. Сервер и Клиент - это потоки, работающие в разных программах.

Это код для Сервера, отправляющий объекты Клиенту.

//clientSocket[i] = Socket object connected with Client
objectOutputStreams[i] = new ObjectOutputStream(clientSocket[i].getOutputStream());
...

//Sending ArrayList<Snake> to Client
objectOutputStreams[i].writeObject(snake);
objectOutputStreams[i].flush();

//Sending Apple object to Client
objectOutputStreams[i].writeObject(apple);
objectOutputStreams[i].flush();

А вот и реализация Snake класса. Apple класс содержит только примитивные переменные типа данных, поэтому я пропущу здесь. Класс Snake содержит ArrayList объекта Part , который также содержит только переменные примитивного типа данных.

Все классы Snake, Apple и Part реализуют Serializable и имеют одинаковый serialVersionUID, равный 1L.

public class Snake implements Serializable{
private static final long serialVersionUID = 1L;

public ArrayList<Part> body = new ArrayList<Part>();
public int maxLength = 4;
public int level = 1;
public int moveCount = 0;
public boolean keysPressed = false;
public Snake(){
    for(int i = 0;i < maxLength;i++) {
        body.add(new Part());
        body.get(i).x = maxLength - i -1;
        body.get(i).y = 0;
    }
}
public Snake(int x, int y){
    for(int i = 0;i < maxLength;i++) {
        body.add(new Part());
        body.get(i).x = maxLength - i - 1 + x;
        body.get(i).y = y;
    }
}

Когда я проверяю значения ArrayList непосредственно перед записью в Client, он содержит все нужные мне значения. Но когда Клиент получает его, он содержит совершенно другие значения, то есть ArrayList, содержащий объекты Snake, заполненные начальными значениями.

Это код для Клиента, получающего объекты с Сервера. Здесь класс Board является классом для Graphics (который реализует JComponent) и содержит ArrayList объекта Snake.

//class implementing JComponent for Graphics
Board board = new Board();
ObjectOutputStream objectOutputStream;
ObjectInputStream objectInputStream;
...
//Tried both ways for reading ArrayList<Snake>. option 1
board.snakes.clear();            
board.snakes.addAll((ArrayList<Snake>)objectInputStream.readObject());

//option 2
//board.snakes = (ArrayList<Snake>)objectInputStream.readObject();
board.apple = (Apple)objectInputStream.readObject();

Как вы можете видеть из кода, я пытаюсь двумя способами установить правильные значения для ArrayList для объекта платы, но они не работают.

Я что-то упускаю при использовании objectStream? Я не совсем понимаю, как использовать потоки в Java, поэтому мне нужна ваша помощь в устранении этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...