简体   繁体   English

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

[英](Node.js, socket.io) JSONObject cannot be converted to int

I'm trying to create a multiplayer game, if the lobby isn't full the host has AI ships which emit their actions to a server where the server broadcasts their "moves" to a blank ship in the clients game.我正在尝试创建一个多人游戏,如果大厅未满,则主机有 AI 飞船,它们将它们的动作发送到服务器,服务器将它们的“移动”广播到客户端游戏中的空白飞船。 The broadcast is accompanied by an "i" which is the AIShips identifier so the correct ship is told to move in the clients game.广播伴随着一个“i”,它是 AIShips 标识符,因此正确的船被告知在客户端游戏中移动。

Here's the code in order that it's used:这是使用它的代码:

Initial emit: (AIShip.java)初始发射:(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();
}

My server: (index.js)我的服务器:(index.js)

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

The response to the broadcast: (SpaceSoccer.java)对广播的响应:(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();
                }
});

The error: W/System.err: org.json.JSONException: Value {"i":0} at i of type org.json.JSONObject cannot be converted to int W/System.err: at org.json.JSON.typeMismatch(JSON.java:100) The error: W/System.err: org.json.JSONException: Value {"i":0} at i of type org.json.JSONObject cannot be converted to int W/System.err: at org.json.JSON.类型不匹配(JSON.java:100)

It's because you are nesting the { "i": identifier } object.这是因为您嵌套了{ "i": identifier } object。 Take a look (explained in the commented code below):看一看(在下面的注释代码中解释):

Initial emit: (AIShip.java)初始发射:(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);
...

My server: (index.js)我的服务器:(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})
});

The response to the broadcast: (SpaceSoccer.java)对广播的响应:(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!
....
});

Solution (not the only one, once you know the reason, tho):解决方案(不是唯一的,一旦你知道原因,tho):
In your index.js change the payload you are sending to something like this, for example:在您的index.js中,将您发送的有效负载更改为类似这样的内容,例如:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM