WebSocket 简介
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于需要实时交互的应用场景(如聊天、实时数据推送)。与 HTTP 不同,WebSocket 允许服务器主动向客户端推送数据,无需频繁建立连接。
Java WebSocket 实现方式
Java 提供了两种主要方式实现 WebSocket:
- Java API for WebSocket (JSR 356):标准 API,支持注解和编程式配置。
- Spring WebSocket:基于 Spring 框架的封装,简化集成(如 STOMP 协议支持)。
使用 JSR 356 实现 WebSocket
服务端实现
java
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/ws") // 定义 WebSocket 端点路径
public class WebSocketServer {
@OnOpen
public void onOpen(Session session) {
System.out.println("客户端连接: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("收到消息: " + message);
// 向客户端发送响应
session.getAsyncRemote().sendText("服务器回复: " + message);
}
@OnClose
public void onClose(Session session) {
System.out.println("连接关闭: " + session.getId());
}
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
}
客户端实现(JavaScript 示例)
javascript
const socket = new WebSocket("ws://localhost:8080/ws");
socket.onopen = () => console.log("连接已建立");
socket.onmessage = (event) => console.log("收到消息: " + event.data);
socket.send("Hello WebSocket!");
使用 Spring WebSocket 实现
依赖配置
Maven 需添加以下依赖:
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
服务端配置
java
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.*;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*");
}
}
自定义处理器
java
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class MyWebSocketHandler extends TextWebSocketHandler {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) {
System.out.println("收到消息: " + message.getPayload());
session.sendMessage(new TextMessage("服务器回复: " + message.getPayload()));
}
}
关键注意事项
- 跨域问题 :确保服务端配置允许客户端域名(如
setAllowedOrigins("*"))。 - 心跳机制:避免连接因空闲被关闭,可通过定期发送心跳消息实现。
- 性能优化 :高并发场景下,使用
Async方法(如getAsyncRemote())提升吞吐量。
参考:gitee.com/a19283598491/sdcfds5/issues/IJEXNX
gitee.com/a19283598491/sdcfds5/issues/IJEXNR
gitee.com/a19283598491/sdcfds5/issues/IJEXNI
gitee.com/a19283598491/sdcfds5/blob/master/hjbh.md
gitee.com/a19283598491/sdcfds5/blob/master/dsds.md
gitee.com/a19283598491/sdcfds5/blob/master/sadsa.md
gitee.com/a19283598491/sdcfds5/blob/master/sdcdsw8.md
gitee.com/a19283598491/sdcfds5/blob/master/asd454.md
gitee.com/a19283598491/sdcfds5/blob/master/sdfcds878.md
gitee.com/a19283598491/sdcfds5/blob/master/sdds85.md
gitee.com/a19283598491/sdcfds5/blob/master/sad881.md
gitee.com/a19283598491/sdcfds5/blob/master/hdsh.md
gitee.com/a19283598491/sdcfds5/blob/master/dscds8.md
gitee.com/a19283598491/sdcfds5/blob/master/lojioj.md
gitee.com/a19283598491/sdcfds5/blob/master/asq843.md
gitee.com/a19283598491/sdcfds5/blob/master/asw101.md
gitee.com/a19283598491/sdcfds5/blob/master/asdq777.md
gitee.com/a19283598491/sdcfds5/blob/master/aws001.md
gitee.com/a19283598491/sdcfds5/blob/master/as002.md
gitee.com/a19283598491/sdcfds5/blob/master/asas003.md
gitee.com/a19283598491/sdcfds5/blob/master/miki004.md
gitee.com/a19283598491/sdcfds5/blob/master/rew01.md
gitee.com/a19283598491/sdcfds5/blob/master/jiu02.md
gitee.com/a19283598491/sdcfds5/blob/master/asddhas01.md
gitee.com/a19283598491/sdcfds5/blob/master/sdak05.md
gitee.com/a19283598491/sdcfds5/blob/master/dsq06.md
gitee.com/a19283598491/sdcfds5/blob/master/oioq08.md
gitee.com/a19283598491/sdcfds5/blob/master/dsaidis09.md
gitee.com/a19283598491/sdcfds5/blob/master/sdacg005.md
gitee.com/a19283598491/sdcfds5/blob/master/wqwq004.md
扩展功能
- STOMP 协议:Spring WebSocket 支持 STOMP,提供更高级的消息路由功能。
- 消息广播 :通过
SimpMessagingTemplate向多个客户端推送消息。 - 安全性:集成 Spring Security 实现 WebSocket 鉴权。
通过上述方法,可快速构建基于 Java 的实时双向通信应用。