我有一个服务器,有多个客户端正在连接。每个客户端都有一个他们可以控制的 body (玩家),但可能会发生碰撞,因此他们需要看到其他人的 body 才能知道为什么他们的某些移动受到限制。
我的解决方案是通过对象输入/输出流传递“World”对象。然后我使用处理来解析并绘制每个主体。这是我收到的错误:
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.jbox2d.dynamics.World
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at Client.setup(Client.java:30)
at processing.core.PApplet.handleDraw(PApplet.java:2280)
at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
at processing.core.PApplet.run(PApplet.java:2176)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.NotSerializableException: org.jbox2d.dynamics.World
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at Player.sendWorld(Player.java:57)
at Server.draw(Server.java:54)
at processing.core.PApplet.handleDraw(PApplet.java:2305)
... 3 more
显然,World 需要先序列化/可序列化,然后才能通过套接字传递。知道我该怎么做吗?我需要为每个主体执行此操作,创建 xml/json 然后传递它,而不是简单地发送给世界吗?
服务器输出
public void sendWorld(World world) {
try {
out.writeObject(world);
out.flush(); // or maybe out.reset()
} catch (IOException e) {
e.printStackTrace();
}
}
客户输入
try {
bodySocket = new Socket(serverHostname, port);
in = new ObjectInputStream(bodySocket.getInputStream());
Object next = in.readObject();
System.out.println("Getting world");
if (next instanceof World) {
this.world = (World) next;
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + serverHostname);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for " + "the connection to: "
+ serverHostname);
e.printStackTrace();
System.exit(1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
客户抽奖
public void draw() {
// Background
background(100);
// Bodies (includes floors, walls, and players)
for (Body body = world.getBodyList(); body != null; body = body
.getNext()) {
Vec2 playerLoc = body.getPosition();
rectMode(PApplet.RADIUS);
fill(255, 100);
rect(playerLoc.x, fieldBottom - playerLoc.y, 10, 10);
}
}
最佳答案
我就是因为这个原因才制作了序列化包:)
我将序列化包含到 protobufs,这可能对您来说是最好的事情(它最大程度地减少了大小)。您可以序列化世界、 body 、关节、形状,无论您想要什么粒度。
这是有关 protobufs 的文档: https://code.google.com/p/protobuf/
关于java - 如何序列化 JBox2d World 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19236212/