(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.JSONObject的i的值{“ i”:0}转换为int W / System.err:位于org.json.JSON.typeMismatch(JSON.java:100)

dongchunl 回答:(Node.js,socket.io)JSONObject无法转换为int

这是因为您要嵌套{ "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!
....
});

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

socket.on("moveAIShipForward",function(data) {
    socket.broadcast.emit("moveAIShipForward",i: data.i})
});
本文链接:https://www.f2er.com/3151652.html

大家都在问