websocket (@ServerEndpoint)基本使用指南
本帖最后由 御坂主机 于 2024-7-13 16:13 编辑1. 引言
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它适用于需要低延迟、高频率通信的应用场景,如在线游戏、实时聊天和股票行情等。Java EE 提供了一个简洁的 API 来支持 WebSocket,其中 `@ServerEndpoint` 注解用于定义 WebSocket 服务器端点。本文将详细介绍如何使用 `@ServerEndpoint` 创建和管理 WebSocket 连接。
1.1 什么是 WebSocket
WebSocket 是一种协议,允许客户端和服务器之间进行双向通信。与传统的 HTTP 不同,WebSocket 连接在初始握手之后保持打开状态,可以在任何一端发送数据。
1.2 `@ServerEndpoint` 注解
`@ServerEndpoint` 是 Java EE 中用于定义 WebSocket 服务器端点的注解。它简化了 WebSocket 服务器的创建过程,使开发者能够专注于业务逻辑而无需处理底层细节。
2. 基本使用
2.1 环境配置
要使用 WebSocket,首先需要确保你的项目中包含相关依赖。对于 Maven 项目,可以在 `pom.xml` 文件中添加以下依赖:
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
2.2 创建 WebSocket 服务器端点
使用 `@ServerEndpoint` 注解定义一个 WebSocket 服务器端点。以下是一个简单的示例:
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/websocket")
public class MyWebSocketServer {
@OnOpen
public void onOpen(Session session) {
System.out.println("Connection opened: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Received message: " + message);
session.getBasicRemote().sendText("Echo: " + message);
}
@OnClose
public void onClose(Session session) {
System.out.println("Connection closed: " + session.getId());
}
@OnError
public void onError(Session session, Throwable throwable) {
System.err.println("Error on connection " + session.getId() + ": " + throwable.getMessage());
}
}
2.3 启动服务器
在 Java EE 环境中,通常使用一个应用服务器来运行 WebSocket 应用。将上述 `MyWebSocketServer` 类部署到服务器中,并启动服务器。访问 `ws://localhost:8080/yourapp/websocket` 即可与服务器建立 WebSocket 连接。
2.4 客户端示例
使用 JavaScript 可以轻松创建一个 WebSocket 客户端来测试服务器端点。以下是一个简单的 HTML 页面,包含一个 WebSocket 客户端:
<!DOCTYPE html>
<html>
<body>
<script>
var ws = new WebSocket("ws://localhost:8080/yourapp/websocket");
ws.onopen = function() {
console.log("Connected to server");
ws.send("Hello Server!");
};
ws.onmessage = function(event) {
console.log("Received from server: " + event.data);
};
ws.onclose = function() {
console.log("Connection closed");
};
ws.onerror = function(error) {
console.error("WebSocket error: " + error);
};
</script>
</body>
</html>
3. 进阶使用
3.1 广播消息
在某些应用场景中,需要将消息广播给所有连接的客户端。可以通过维护一个 `Session` 的集合来实现这一点:
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.websocket.Session;
public class MyWebSocketServer {
private static Set<Session> clients = Collections.synchronizedSet(new HashSet<>());
@OnOpen
public void onOpen(Session session) {
clients.add(session);
System.out.println("Connection opened: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Received message: " + message);
broadcast("Echo: " + message);
}
@OnClose
public void onClose(Session session) {
clients.remove(session);
System.out.println("Connection closed: " + session.getId());
}
@OnError
public void onError(Session session, Throwable throwable) {
System.err.println("Error on connection " + session.getId() + ": " + throwable.getMessage());
}
private void broadcast(String message) {
for (Session client : clients) {
if (client.isOpen()) {
client.getBasicRemote().sendText(message);
}
}
}
}
3.2 处理复杂消息
在实际应用中,消息可能包含复杂的数据结构。可以使用 JSON 序列化和反序列化来处理这些数据:
import com.google.gson.Gson;
public class MyWebSocketServer {
private Gson gson = new Gson();
@OnMessage
public void onMessage(String message, Session session) {
MyMessage myMessage = gson.fromJson(message, MyMessage.class);
// 处理消息
String response = gson.toJson(new MyMessage("response", "Processed"));
session.getBasicRemote().sendText(response);
}
}
class MyMessage {
private String type;
private String content;
// 构造函数、getter 和 setter
}
4. 总结
通过本文的介绍,我们了解了如何使用 `@ServerEndpoint` 创建和管理 WebSocket 连接。从基本的连接管理到广播消息,再到处理复杂消息,`@ServerEndpoint` 为开发者提供了强大的工具。希望这篇指南能帮助你在项目中更好地使用 WebSocket。
5. 参考文献
1. Java EE 官方文档 - WebSocket API
2. RFC 6455 - The WebSocket Protocol
3. Gson 官方文档
------------------------------------------------------------------------------------------------------------------------------------------
========御 坂 主 机========
>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<
>> 推广/合作/找我玩TG号 : @Misaka_Offical <<
-------------------------------------------------------------------------------------------------------------------------------------------
页:
[1]