【问题标题】:Java Socket IO doesn't send to Node.js, but can connect and receiveJava Socket IO 不发送到 Node.js,但可以连接和接收
【发布时间】:2024-08-20 01:55:01
【问题描述】:

我正在使用this Java 库在 Node.js 和使用 socket.io 的 Java 应用程序之间进行通信。

这是我的 Java 实现:

socket = IO.socket("http://localhost:3000");

socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {

      @Override
      public void call(Object... args) {
          System.out.println("Connected!");
      }

}).on("error", new Emitter.Listener() {

    @Override
    public void call(Object... args) {
        System.out.println("error");                    
    }

});

socket.connect();

这是我的 Node.js 实现:

    const localsocket = require('socket.io')();

    localsocket.on('connection', () => {
        console.log('Connected!');

        localsocket.emit('error', {messsage: "error!~!"})
    });

    localsocket.on('poke', (msg) => {
        console.log("poked");
    });


    localsocket.listen(3000);
    console.log("listening on port 3000");

如您所见,只要 Java 代码连接,Javascript 就会广播一个 error,Java 代码会接收到该error

Java 代码输出:

Connected!
error

Node.js 代码输出:

Listening on port 3000
Connected!

现在,我在 Java 代码中还有一个按钮,它执行以下操作:

if (socket.connected()) {
    System.out.println("do poke");
    socket.emit("poke", new JSONObject("{ \"message\" : \"hello\" }"));
}

当我按下此按钮时,消息do poke 出现在 Java 控制台中,但没有消息出现在 Node.js 终端中。

完整的 Java 代码:

private Socket socket;
@FXML private ToggleButton button;

public Main(String com) { // constructor

    try {

        socket = IO.socket("http://localhost:3000");

        socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {

              @Override
              public void call(Object... args) {
                  System.out.println("connected woo!");
              }

        }).on("error", new Emitter.Listener() {

            @Override
            public void call(Object... args) {
                System.out.println("error");                    
            }

        });

        socket.connect();

    } catch (URISyntaxException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

@FXML
public void buttonToggle() {
    if (button.isSelected()) {
        if (socket.connected()) {
            System.out.println("do poke");
            socket.emit("poke", new JSONObject("{ \"message\" : \"hello\" }"));
        }
    }
}

【问题讨论】:

    标签: java node.js socket.io


    【解决方案1】:

    所以,我设法找到了一种可行的方法,以防其他人遇到同样的问题。

    我只需要稍微重做我的 Javascript 代码并为服务器定义一个框架

    const app = require('express')();
    const server = app.listen(3000);
    const io_local = require('socket.io')(server);
    
    io_local.on('connection', (socket) => {
        console.log('New connection!');
    
        socket.on('poke', () => {
            console.log("poked");
        });
    
        socket.on('error', () => {
            console.log("error");
        });
    
        socket.emit('error', {message: "error"});
    });
    

    Java 端也是一样。一切正常。

    【讨论】: