找回密码
 立即注册
查看: 659|回复: 0

[其它] websocket (@ServerEndpoint)基本使用指南

[复制链接]

224

主题

0

回帖

773

积分

高级会员

积分
773
发表于 2024-7-12 17:38:39 | 显示全部楼层 |阅读模式
本帖最后由 御坂主机 于 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` 文件中添加以下依赖:

  1.     <dependency>
  2.         <groupId>javax.websocket</groupId>
  3.         <artifactId>javax.websocket-api</artifactId>
  4.         <version>1.1</version>
  5.     </dependency>
复制代码


2.2 创建 WebSocket 服务器端点

使用 `@ServerEndpoint` 注解定义一个 WebSocket 服务器端点。以下是一个简单的示例:

  1.     import javax.websocket.OnClose;
  2.     import javax.websocket.OnError;
  3.     import javax.websocket.OnMessage;
  4.     import javax.websocket.OnOpen;
  5.     import javax.websocket.Session;
  6.     import javax.websocket.server.ServerEndpoint;

  7.     @ServerEndpoint("/websocket")
  8.     public class MyWebSocketServer {

  9.         @OnOpen
  10.         public void onOpen(Session session) {
  11.             System.out.println("Connection opened: " + session.getId());
  12.         }

  13.         @OnMessage
  14.         public void onMessage(String message, Session session) {
  15.             System.out.println("Received message: " + message);
  16.             session.getBasicRemote().sendText("Echo: " + message);
  17.         }

  18.         @OnClose
  19.         public void onClose(Session session) {
  20.             System.out.println("Connection closed: " + session.getId());
  21.         }

  22.         @OnError
  23.         public void onError(Session session, Throwable throwable) {
  24.             System.err.println("Error on connection " + session.getId() + ": " + throwable.getMessage());
  25.         }
  26.     }
复制代码


2.3 启动服务器

在 Java EE 环境中,通常使用一个应用服务器来运行 WebSocket 应用。将上述 `MyWebSocketServer` 类部署到服务器中,并启动服务器。访问 `ws://localhost:8080/yourapp/websocket` 即可与服务器建立 WebSocket 连接。

2.4 客户端示例

使用 JavaScript 可以轻松创建一个 WebSocket 客户端来测试服务器端点。以下是一个简单的 HTML 页面,包含一个 WebSocket 客户端:

  1.     <!DOCTYPE html>
  2.     <html>
  3.     <body>
  4.         <script>
  5.             var ws = new WebSocket("ws://localhost:8080/yourapp/websocket");

  6.             ws.onopen = function() {
  7.                 console.log("Connected to server");
  8.                 ws.send("Hello Server!");
  9.             };

  10.             ws.onmessage = function(event) {
  11.                 console.log("Received from server: " + event.data);
  12.             };

  13.             ws.onclose = function() {
  14.                 console.log("Connection closed");
  15.             };

  16.             ws.onerror = function(error) {
  17.                 console.error("WebSocket error: " + error);
  18.             };
  19.         </script>
  20.     </body>
  21.     </html>
复制代码


3. 进阶使用

3.1 广播消息

在某些应用场景中,需要将消息广播给所有连接的客户端。可以通过维护一个 `Session` 的集合来实现这一点:

  1.     import java.util.Collections;
  2.     import java.util.HashSet;
  3.     import java.util.Set;
  4.     import javax.websocket.Session;

  5.     public class MyWebSocketServer {

  6.         private static Set<Session> clients = Collections.synchronizedSet(new HashSet<>());

  7.         @OnOpen
  8.         public void onOpen(Session session) {
  9.             clients.add(session);
  10.             System.out.println("Connection opened: " + session.getId());
  11.         }

  12.         @OnMessage
  13.         public void onMessage(String message, Session session) {
  14.             System.out.println("Received message: " + message);
  15.             broadcast("Echo: " + message);
  16.         }

  17.         @OnClose
  18.         public void onClose(Session session) {
  19.             clients.remove(session);
  20.             System.out.println("Connection closed: " + session.getId());
  21.         }

  22.         @OnError
  23.         public void onError(Session session, Throwable throwable) {
  24.             System.err.println("Error on connection " + session.getId() + ": " + throwable.getMessage());
  25.         }

  26.         private void broadcast(String message) {
  27.             for (Session client : clients) {
  28.                 if (client.isOpen()) {
  29.                     client.getBasicRemote().sendText(message);
  30.                 }
  31.             }
  32.         }
  33.     }
复制代码


3.2 处理复杂消息

在实际应用中,消息可能包含复杂的数据结构。可以使用 JSON 序列化和反序列化来处理这些数据:

  1.     import com.google.gson.Gson;

  2.     public class MyWebSocketServer {

  3.         private Gson gson = new Gson();

  4.         @OnMessage
  5.         public void onMessage(String message, Session session) {
  6.             MyMessage myMessage = gson.fromJson(message, MyMessage.class);
  7.             // 处理消息
  8.             String response = gson.toJson(new MyMessage("response", "Processed"));
  9.             session.getBasicRemote().sendText(response);
  10.         }
  11.     }

  12.     class MyMessage {
  13.         private String type;
  14.         private String content;

  15.         // 构造函数、getter 和 setter
  16.     }
复制代码


4. 总结

通过本文的介绍,我们了解了如何使用 `@ServerEndpoint` 创建和管理 WebSocket 连接。从基本的连接管理到广播消息,再到处理复杂消息,`@ServerEndpoint` 为开发者提供了强大的工具。希望这篇指南能帮助你在项目中更好地使用 WebSocket。

5. 参考文献

1. Java EE 官方文档 - WebSocket API
2. RFC 6455 - The WebSocket Protocol
3. Gson 官方文档





------------------------------------------------------------------------------------------------------------------------------------------

========  御 坂 主 机  ========

>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<

>> 推广/合作/找我玩  TG号 : @Misaka_Offical <<

-------------------------------------------------------------------------------------------------------------------------------------------

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-3 17:25 , Processed in 0.066420 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表