Я пытаюсь сделать многопользовательскую игру с 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, поэтому мне нужна ваша помощь в устранении этой проблемы.