我试图用Java制作多人游戏,但我坚持通过对象流发送对象并正确接收它。 从服务器,我使用ObjectOutputStream将 Snake 对象和 Apple 对象发送到客户端。服务器和客户端是在不同程序中运行的线程。
这是服务器的代码,用于将对象发送到客户端。
//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类包含 Part 对象的ArrayList,该对象也仅包含原始数据类型变量。
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;
}
}
当我在写给Client之前检查ArrayList的值时,它包含了我想要的所有正确值。但是当Client收到它时,它包含完全不同的值,这是一个ArrayList,其中包含充满初始值的Snake对象。
这是客户端代码,用于从服务器接收对象。在这里, Board 类是Graphics(实现JComponent)的类,并且包含Snake对象的ArrayList。
//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中的流不完全了解,因此需要您的帮助来解决此问题。