【问题标题】:(Node.js, socket.io) JSONObject cannot be converted to int(Node.js, socket.io) JSONObject 无法转换为 int
【发布时间】:2019-11-06 23:00:53
【问题描述】:

我正在尝试创建一个多人游戏,如果大厅未满,主机有 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: Value {"i":0} at i of type org.json.JSONObject cannot be convert to int W/System.err:在 org.json.JSON.typeMismatch(JSON.java:100)

【问题讨论】:

  • 你登录args[0]了吗?这个参数有什么内容?

标签: java node.js json socket.io


【解决方案1】:

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

【讨论】:

  • 非常感谢您的详细解答!这是我在服务器上的第一次尝试,我以前从未使用过 js,因此非常感谢这个答案!
猜你喜欢
  • 1970-01-01
  • 2013-06-30
  • 2012-12-12
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多