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 生态中的各种功能的复杂应用场景。根据项目的不同需求,可以选择合适的实现方式。