(Node.js,socket.io)JSONObject无法转换为int



我正在尝试创建一个多人游戏,如果大厅没有满,主机会有AI飞船将他们的动作发送到服务器,服务器会在客户端游戏中向空白飞船广播他们的"动作"。广播附带一个"i",这是AIShips的标识符,因此在客户端游戏中,正确的船只会被告知移动。

以下是按使用顺序排列的代码:

初始发射:(AIShip.java(

JSONObject data = new JSONObject();
try {
data.put("i", identifier); //Identifier is an int set once in the constructor
gameScreen.spaceSoccer.socket.emit("moveAIShipForward", data);
} catch (JSONException e){
e.printStackTrace();
}

我的服务器:(index.js(

socket.on("moveAIShipForward", function(i) {
socket.broadcast.emit("moveAIShipForward", {id: socket.id, i: i})
});

对广播的响应:(SpaceSoccer.java(

.on("moveAIShipForward", new Emitter.Listener() {
@Override
public void call(Object... args) {
JSONObject data = (JSONObject) args[0];
try {
int i = data.getInt("i"); //error
gameScreen.AIShip[i].moveBodyForward();
} catch (JSONException e) {
e.printStackTrace();
}
});

错误:W/System.err:org.json.JSONException:org.json.GSONObject类型的i处的值{"i":0}无法转换为intW/System.err:在org.json.json.typeMismatch(json.java:100(

这是因为您正在嵌套{ "i": identifier }对象。看看(在下面的注释代码中解释(:

初始发射:(AIShip.java(

JSONObject data = new JSONObject();
...
data.put("i", identifier);
// here the `data` is like `{ "i": 0 }` and it's emmited
gameScreen.spaceSoccer.socket.emit("moveAIShipForward", data);
...

我的服务器:(index.js(

// here, the `i` is what you have sent earlier: `{ "i": 0 }`
socket.on("moveAIShipForward", function(i) {
// here, you are passing the `{ "i": 0 }` object to the new object, under `i` key, the resulting object looks like this:
// `{ id: 0, i: { i: 0 } }`
// and it's emitted
socket.broadcast.emit("moveAIShipForward", {id: socket.id, i: i})
});

对广播的响应:(SpaceSoccer.java(

.on("moveAIShipForward", new Emitter.Listener() {
...
JSONObject data = (JSONObject) args[0];
try {
// now here, the object looks like above (in the .js file), so `.get("i")` would return a `{ "i": 0 }` obejct, which obviously cannot be converted to int.
int i = data.getInt("i"); // { "i": 0 } is not an integer!
....
});

解决方案(不是唯一的解决方案,一旦您知道原因,tho(:
index.js中,将您发送的有效载荷更改为类似的内容,例如:

socket.on("moveAIShipForward", function(data) {
socket.broadcast.emit("moveAIShipForward", {id: socket.id, i: data.i})
});

最新更新