Java Socket IO不会发送到Node.js,但可以连接和接收

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Socket IO不会发送到Node.js,但可以连接和接收相关的知识,希望对你有一定的参考价值。

我正在使用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就会广播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" }"));
        }
    }
}
答案

因此,我设法找出一种可以在其他人遇到相同问题的情况下起作用的方法。

我只需要重做我的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方面是相同的。一切正常。

以上是关于Java Socket IO不会发送到Node.js,但可以连接和接收的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 仅向发送者发送数据包

java或者scala写socket客户端发送头消息和消息体到服务端并接收返回信息,这个头消息怎么写

带有 socket.io 的快递服务器不会发送给正确的收件人

Java 实例演示-ServerSocket 和 Socket 通信实例

一起发送 JSON 和 blob

请教怎样发送socket请求包,并获得返回数据