我的ObjectOutputStream无法正常工作

时间:2019-05-08 12:25:24

标签: java multithreading sockets server

我试图用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中的流不完全了解,因此需要您的帮助来解决此问题。

0 个答案:

没有答案