下面是关于Java应用层协议WebSocket实现消息推送的详细攻略。
WebSocket简介
WebSocket是一种应用层协议,它是用于在客户端和服务器之间进行双向通信的标准。它是在同一个TCP连接上,以低延迟和高吞吐量的方式进行通信的协议,可以为Web应用程序提供实时通信和数据流的创建。
Java实现WebSocket
Java实现WebSocket,最常用的是javax.websocket API和spring-websocket框架。下面我们分别介绍这两种方式。
javax.websocket API
javax.websocket API是Java EE7中添加的Java WebSocket规范的接口,它为Java开发人员提供了一种实现WebSocket的标准方式。下面是一个简单的示例代码。
服务端代码
@ServerEndpoint("/websocket/{nickname}")
public class ChatEndpoint {
private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
/**
* 有新连接进入
*/
@OnOpen
public void onOpen(Session session, @PathParam("nickname") String nickname) {
sessions.add(session);
String message = "欢迎" + nickname + "加入聊天室!";
broadcast(message);
}
/**
* 关闭连接
*/
@OnClose
public void onClose(Session session, @PathParam("nickname") String nickname) {
sessions.remove(session);
String message = nickname + "已离开聊天室!";
broadcast(message);
}
/**
* 收到客户端消息后调用的方法
*/
@OnMessage
public void onMessage(String message, Session session, @PathParam("nickname") String nickname) {
String info = nickname + ":" + message;
broadcast(info);
}
/**
* 发生错误时调用
*/
@OnError
public void onError(Session session, Throwable error) {
System.out.println("发生错误");
error.printStackTrace();
}
/**
* 群发消息
*/
private void broadcast(String message) {
for (Session session : sessions) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端代码
var ws = new WebSocket("ws://localhost:8080/websocket/" + nickname);
ws.onopen = function() {
console.log("连接成功");
}
ws.onmessage = function(event) {
console.log(event.data);
}
ws.onclose = function() {
console.log("连接关闭");
}
ws.onerror = function() {
console.log("连接出错");
}
function send() {
var message = document.getElementById("message").value;
ws.send(message);
}
以上示例代码实现了一个简单的聊天室,服务端使用Java实现WebSocket,客户端使用JavaScript的WebSocket API。
Spring WebSocket
Spring WebSocket是基于javax.websocket API实现的,所以它也是一种使用Java实现WebSocket的方式。相较于javax.websocket API,Spring WebSocket提供了更强大的功能和更方便的使用方式。
配置WebSocket支持
在Spring Boot项目中使用WebSocket,需要在pom.xml中引入spring-boot-starter-websocket,然后在配置类上添加@EnableWebSocket注解。以下是示例代码。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new ChatWebSocketHandler(), "/websocket").setAllowedOrigins("*");
registry.addHandler(new ChatSockJSHandler(), "/sockjs").setAllowedOrigins("*").withSockJS();
}
}
WebSocketHandler
WebSocketHandler是处理WebSocket请求的核心接口,可以通过它完成WebSocket消息的处理和响应。以下是示例代码。
public class ChatWebSocketHandler extends TextWebSocketHandler {
private static final List<WebSocketSession> SESSIONS = Collections.synchronizedList(new ArrayList<>());
/**
* 客户端建立连接
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
SESSIONS.add(session);
String message = "欢迎 " + session.getAttributes().get("nickname") + " 进入聊天室!";
broadcast(message);
}
/**
* 收到客户端消息
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String info = session.getAttributes().get("nickname") + ":" + message.getPayload();
broadcast(info);
}
/**
* 客户端断开连接
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
SESSIONS.remove(session);
String message = session.getAttributes().get("nickname") + "已离开聊天室!";
broadcast(message);
}
/**
* 广播消息给所有客户端
*/
private void broadcast(String message) throws Exception {
for (WebSocketSession session : SESSIONS) {
session.sendMessage(new TextMessage(message));
}
}
}
SockJS支持
SockJS是一种WebSocket的备选方案,用于在不支持WebSocket的环境下使用WebSocket。Spring WebSocket提供了SockJS支持,只需要在WebSocketHandlerRegistrar中使用withSockJS()即可。以下是示例代码。
public class ChatSockJSHandler extends AbstractWebSocketHandler implements SockJsService {
private static final List<WebSocketSession> SESSIONS = Collections.synchronizedList(new ArrayList<>());
/**
* 客户端建立连接
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
SESSIONS.add(session);
String message = "欢迎 " + session.getAttributes().get("nickname") + " 进入聊天室!";
broadcast(message);
}
/**
* 收到客户端消息
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String info = session.getAttributes().get("nickname") + ":" + message.getPayload();
broadcast(info);
}
/**
* 客户端断开连接
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
SESSIONS.remove(session);
String message = session.getAttributes().get("nickname") + "已离开聊天室!";
broadcast(message);
}
/**
* 广播消息给所有客户端
*/
private void broadcast(String message) throws Exception {
for (WebSocketSession session : SESSIONS) {
session.sendMessage(new TextMessage(message));
}
}
}
以上是Java应用层协议WebSocket实现消息推送的详细攻略,同时提供了两种实现方式的示例代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java应用层协议WebSocket实现消息推送 - Python技术站