御坂主机 发表于 2024-7-12 17:38:39

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]
查看完整版本: websocket (@ServerEndpoint)基本使用指南