关于Nodejs与java之间建立长连接

关于Nodejs与java之间建立长连接

请教各位大神,nodejs是否可以作为服务端与java应用之间建立长连接,进行推送数据,应该通过什么实现呢?

7 回复

关于Node.js与Java之间建立长连接

在现代Web开发中,长连接(例如WebSocket或HTTP/2 Server Push)是一种常见的技术,用于实现实时双向通信。Node.js非常适合用作服务端来处理这种类型的连接,因为它具有非阻塞I/O模型,使得它能够高效地处理大量的并发连接。

使用WebSocket建立长连接

WebSocket 是一种在单个TCP连接上进行全双工通信的协议。使用WebSocket可以在客户端和服务端之间建立持久连接,从而实现实时数据推送。

Node.js 示例代码

首先,我们需要一个WebSocket服务器库。常用的有ws库。

  1. 安装 ws 库:

    npm install ws
    
  2. 创建一个简单的WebSocket服务器:

    const WebSocket = require('ws');
    
    // 创建一个WebSocket服务器,监听8080端口
    const wss = new WebSocket.Server({ port: 8080 });
    
    // 当客户端连接时触发
    wss.on('connection', function connection(ws) {
      console.log('A client connected.');
    
      // 发送消息给客户端
      ws.send('Hello, client!');
    
      // 接收客户端的消息
      ws.on('message', function incoming(message) {
        console.log('received: %s', message);
      });
    });
    
  3. 在Java客户端中使用WebSocket连接到Node.js服务器。这里我们使用Java中的javax.websocket API:

import javax.websocket.ContainerProvider;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;

public class WebSocketClient {
    public static void main(String[] args) {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            String uri = "ws://localhost:8080";
            System.out.println("Connecting to " + uri);
            Session session = container.connectToServer(WebSocketClientEndpoint.class, new URI(uri));
            session.getBasicRemote().sendText("Hello from Java!");
            session.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 创建对应的WebSocket客户端端点类:
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.ClientEndpoint;
import javax.websocket.EndpointConfig;

@ClientEndpoint
public class WebSocketClientEndpoint {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("Connected to server");
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("Received from server: " + message);
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        System.out.println("Session closed because of " + closeReason);
    }
}

总结

以上代码展示了如何使用WebSocket在Node.js和Java之间建立长连接。Node.js作为WebSocket服务器,Java作为客户端。这种方式非常适合实时数据推送的应用场景,如在线聊天、实时通知等。

希望这些示例代码对你有所帮助!


求大神解惑。。。

如果你已经用Nodejs了,那为什么还要用long pulling呢?Socket.io好像更好些。

可以用net.socket啊,很简单的,TCP的连接

pomelo已经实现了这种需求,可以参考一下。

Node.js 可以作为服务端与 Java 应用之间建立长连接,用于实时数据推送。一种常见的实现方式是使用 WebSocket 协议。WebSocket 提供了全双工通信通道,适用于需要实时双向通信的应用场景。

示例代码

Node.js 服务端(使用 ws 模块)

首先,你需要安装 ws 模块:

npm install ws

然后创建一个简单的 WebSocket 服务器:

const WebSocket = require('ws');

// 创建一个 WebSocket 服务器,监听 8080 端口
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
    console.log("新的客户端连接");

    ws.on('message', function incoming(message) {
        console.log('接收到来自客户端的消息: %s', message);
    });

    // 向客户端推送消息
    setInterval(() => {
        ws.send(`服务端推送的数据 ${Date.now()}`);
    }, 5000);
});

console.log('WebSocket 服务器运行在 http://localhost:8080');

Java 客户端(使用 javax.websocket

Java 客户端可以通过 javax.websocket API 连接到 WebSocket 服务器。

首先,添加依赖项到你的 pom.xml 文件中:

<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.1</version>
    <scope>provided</scope>
</dependency>

然后创建一个 Java 客户端类:

import javax.websocket.ContainerProvider;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import java.net.URI;

public class WebSocketClient {

    public static void main(String[] args) {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            String uri = "ws://localhost:8080";
            System.out.println("尝试连接到: " + uri);
            Session session = container.connectToServer(WebSocketClientEndpoint.class, URI.create(uri));

            session.getBasicRemote().sendText("Hello Server!");

            // 在这里处理接收到的消息
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

// 创建 WebSocket 客户端端点
import javax.websocket.ClientEndpoint;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;

@ClientEndpoint
public class WebSocketClientEndpoint {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("成功打开会话");
    }

    @OnMessage
    public void onMessage(String message) {
        System.out.println("从服务端收到消息: " + message);
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("会话已关闭");
    }
}

上述代码展示了如何使用 WebSocket 实现 Node.js 服务端和 Java 客户端之间的长连接,并且可以进行双向数据通信。

回到顶部