Java WebSocket 服务的两种实现方式

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合于实时应用程序。在 Java 中,有多种方法来实现 WebSocket 服务。以下是两种常用的实现方式:使用 Java EE 中的 javax.websocket API 和使用 Spring 框架中的 WebSocket 支持。

一、使用 javax.websocket API 实现 WebSocket 服务

Java EE 提供了标注为 @ServerEndpoint 的 WebSocket API,可以轻松实现 WebSocket 服务。以下是一个简单的示例。

步骤1:添加依赖

如果你使用 Maven,可以在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.tyrus</groupId>
    <artifactId>tyrus-standalone-client</artifactId>
    <version>1.17</version>
</dependency>

步骤2:创建 WebSocket 服务器端

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/websocket")
public class MyWebSocket {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("新连接: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("收到消息: " + message);
        try {
            session.getBasicRemote().sendText("服务器收到消息: " + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("关闭连接: " + session.getId());
    }
}

步骤3:部署服务器

为了运行上述代码,您需要将其部署到 Java EE 支持的服务器(如 Tomcat、GlassFish 等)。启动服务器后,您可以使用 WebSocket 客户端进行连接测试。

二、使用 Spring WebSocket 实现 WebSocket 服务

Spring 框架提供了对 WebSocket 的强大支持,使用起来也非常方便。以下是一个基于 Spring 的简单示例。

步骤1:添加依赖

在 Maven 中添加 Spring WebSocket 的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

步骤2:创建 WebSocket 配置

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS(); // 允许使用 SockJS 进行连接
    }
}

步骤3:创建消息处理器

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class WebSocketController {

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public String greeting(String message) {
        return "服务器响应: " + message;
    }
}

步骤4:创建 WebSocket 客户端

你可以使用 JavaScript 或其它语言编写 WebSocket 客户端来连接这个 Spring WebSocket 服务器。在前端,你可以使用 SockJS 和 STOMP 协议来进行更友好的连接管理。

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs/1.4.0/sockjs.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
</head>
<body>
<script>
    var socket = new SockJS('/ws');
    var stompClient = Stomp.over(socket);

    stompClient.connect({}, function (frame) {
        console.log('连接成功: ' + frame);
        stompClient.subscribe('/topic/greetings', function (greeting) {
            console.log("接收到消息: " + greeting.body);
        });
    });

    // 发送消息
    function sendMessage(message) {
        stompClient.send("/app/hello", {}, message);
    }
</script>
</body>
</html>

总结

以上两种方式都是在 Java 中实现 WebSocket 服务的有效方法。javax.websocket API 适用于更加轻量级的应用,而 Spring WebSocket 则更适合需要整合 Spring 生态中的各种功能的复杂应用场景。根据项目的不同需求,可以选择合适的实现方式。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部