java WebSocket 服务端实现代码

下面是实现Java WebSocket服务端的完整攻略,包括示例说明。

准备工作

在开始编写WebSocket服务端代码之前,需要先确保拥有以下条件:

  1. Java开发环境,最好使用JDK8或以上版本。
  2. WebSocket API,Java提供了JSR-356标准的WebSocket API,可以通过Maven添加依赖以使用API。
<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.1</version>
</dependency>

编写代码

实现Endpoint

在Java WebSocket中,需要实现一个Endpoint类来处理WebSocket的连接请求和消息。一个Endpoint可以处理多个WebSocket连接,每个连接都代表一个会话。下面是一个简单的Endpoint实现代码示例:

import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/websocket")
public class WebSocketEndpoint {

    @OnMessage
    public void onMessage(Session session, String message) {
        System.out.println("Received message: " + message);
        session.getAsyncRemote().sendText("Server received your message: " + message);
    }

}

在这个示例中,使用@ServerEndpoint注解标注了一个WebSocket Endpoint,该Endpoint可以通过访问ws://yourhost/yourapp/websocket来进行连接。

@OnMessage注解表示该方法用于处理WebSocket的消息,当收到消息时,该方法会被自动调用。当WebSocket的回话收到消息时,该方法会打印出收到的消息,并使用session.getAsyncRemote().sendText()方法回复消息。

配置WebSocket容器

WebSocket容器负责监听WebSocket连接请求,并将请求转发给对应的Endpoint来处理。下面是一个简单的WebSocket容器配置代码示例:

import javax.websocket.server.ServerEndpointConfig;
import javax.websocket.server.ServerEndpointConfig.Configurator;

public class WebSocketConfigurator extends Configurator {

    @Override
    public <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {
        return (T) new WebSocketEndpoint();
    }

    @Override
    public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
        config.getUserProperties().put("handshake", request.getHeaders().get("Upgrade").get(0));
    }

}

在这个示例中实现了WebSocket容器的两个接口方法:

  • getEndpointInstance() :返回一个WebSocket Endpoint实例,用于处理WebSocket连接请求。
  • modifyHandshake() :该方法用于修改WebSocket握手时的HTTP请求和响应。在这个示例中,将握手时请求的Upgrade头部放入WebSocket容器的用户属性中,以便后续使用。

启动WebSocket容器

最后,需要使用WebSocket容器来启动WebSocket服务。在Java中,使用内置的WebSocket容器启动代码可以很方便地启动WebSocket服务:

import javax.websocket.server.ServerContainer;
import org.apache.tomcat.websocket.server.WsContextListener;

public class WebSocketMain implements WsContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        try {
            ServerContainer serverContainer = (ServerContainer) sce.getServletContext()
                .getAttribute("javax.websocket.server.ServerContainer");
            serverContainer.addEndpoint(ServerEndpointConfig.Builder.create(WebSocketEndpoint.class, "/websocket")
                .configurator(new WebSocketConfigurator()).build());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }

}

在这个示例中,首先实现了WsContextListener接口,该接口可监听WebSocket容器的上下文初始化和销毁事件。当WebSocket容器上下文初始化时,使用ServerContainer.addEndpoint()方法注册WebSocket Endpoint,并指定Endpoint的路径和配置信息。当WebSocket容器上下文被销毁时。

同时,也可以使用Spring Boot的@Component@ServerEndpoint注解来简化WebSocket服务端的实现代码。

示例说明

示例 1:简单的消息回复

在这个示例中,编写一个WebSocket服务端,如收到消息,直接回复该消息。客户端代码可以使用任何支持WebSocket的客户端库进行测试。

@ServerEndpoint("/websocket")
public class WebSocketEndpoint {

    @OnMessage
    public void onMessage(Session session, String message) {
        System.out.println("Received message: " + message);
        session.getAsyncRemote().sendText("Server received your message: " + message);
    }

}

示例 2:模拟聊天室

在这个示例中,编写一个WebSocket服务端,支持多个用户同时连接,每个用户都可以发送消息给其他用户。客户端代码可以使用任何支持WebSocket的客户端库进行测试。

@ServerEndpoint("/chat")
public class ChatEndpoint {

    static Set<Session> users = Collections.synchronizedSet(new HashSet<>());

    @OnOpen
    public void handleOpen(Session userSession) {
        users.add(userSession);
    }

    @OnClose
    public void handleClose(Session userSession) {
        users.remove(userSession);
    }

    @OnMessage
    public void handleMessage(String message, Session userSession) throws IOException {
        String username = (String) userSession.getUserProperties().get("username");
        if (username == null) {
            userSession.getUserProperties().put("username", message);
            userSession.getBasicRemote().sendText("System: you are now connected as " + message);
        } else {
            for (Session session : users) {
                if (session != userSession) {
                    session.getBasicRemote().sendText(username + ": " + message);
                }
            }
        }
    }

}

在这个示例中,首先定义了一个线程安全的Set来存储WebSocket用户的会话(Session)。当有一个新用户连接时,将其加入到这个Set中。当有一个用户断开连接时,将其从Set中移除。当一个用户发送消息时,服务器会遍历所有连接的用户会话,并将消息发送给除了消息发送者以外的其他所有用户。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java WebSocket 服务端实现代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java中的异步与线程池解读

    Java中的异步与线程池解读 什么是异步? 异步是指一个方法调用不会阻塞当前线程,而是立即返回,然后在另一个线程上执行。由于异步方法不会阻塞当前线程,所以可以提高系统的并发能力,避免系统因等待I/O等操作而造成的阻塞。 在Java中,异步通常是指使用线程池来执行一些耗时的任务。Java 5引入了java.util.concurrent包,其中提供的Excut…

    Java 2023年5月18日
    00
  • 深入Ajax代理的Java Servlet的实现详解

    “深入Ajax代理的Java Servlet的实现详解”是一篇介绍如何使用Java Servlet实现Ajax代理的文章。本文一共分为以下几个部分: Ajax代理的概念及作用 Java Servlet的基础知识 使用Java Servlet实现Ajax代理的步骤 示例说明 1. Ajax代理的概念及作用 Ajax代理是一种通过服务器中转Ajax请求的技术。在…

    Java 2023年6月16日
    00
  • 如何创建SpringBoot项目

    下面是如何创建一个SpringBoot项目的完整攻略,包括两个示例。 概述 SpringBoot是一个开源的Java框架,通常用于创建Web应用程序和微服务。SpringBoot使用约定优于配置的方式,使得应用程序的配置变得非常简单。 在创建SpringBoot项目之前,需要先确保你的机器上已经安装好了Java和Maven环境,这两个环境是构建SpringB…

    Java 2023年5月15日
    00
  • java开发 线上问题排查命令详解

    Java开发 线上问题排查命令详解 在Java应用线上运行过程中可能会遇到各种问题,例如应用启动失败、性能瓶颈等等。本文将介绍一些常用的Java开发线上问题排查命令,帮助开发人员更快速、准确地定位问题。 查看应用状态 jps jps命令用于列出Java应用进程的PID(进程ID)和名称,可用于检查应用是否正常启动并在运行。 jps 输出示例: 1234 Ap…

    Java 2023年5月27日
    00
  • SpringBoot整合Shiro两种方式(总结)

    Spring Boot整合Shiro两种方式(总结) Shiro是一个流行的Java安全框架,可以提供身份验证、授权、加密等功能。Spring Boot可以很方便地与Shiro集成,本文将介绍两种Spring Boot整合Shiro的方式,并提供两个示例,演示如何使用Spring Boot整合Shiro。 1. 方式一:使用Shiro-Spring Boot…

    Java 2023年5月14日
    00
  • java生成图片验证码功能

    下面是详细讲解”Java生成图片验证码功能”的完整攻略: 1. 确定需求 首先,我们需要明确这个功能的需求,即在Java Web应用中生成一个随机的图片验证码,以用于用户填写和校验,防止机器人攻击或恶意提交。 2. 添加依赖 接下来,我们需要添加相关的依赖。Java中生成图片验证码需要用到jcaptcha这个开源工具包,我们可以在pom.xml中添加它的依赖…

    Java 2023年6月15日
    00
  • Java线程池必知必会知识点总结

    Java线程池必知必会知识点总结 在并发编程中,线程池是一种重要的资源管理方式。线程池可以管理和执行多个线程,从而提高程序的性能和效率,同时还能避免线程创建和销毁的开销。 本文将介绍Java线程池的相关知识点,包括线程池的基本概念、实现原理、使用方法和注意事项。 线程池的基本概念 Java中的线程池主要有两种实现方式:FixedThreadPool和Cach…

    Java 2023年5月20日
    00
  • Java中字符编码格式详解

    Java中字符编码格式详解 在Java中,字符编码格式是一个非常重要的概念,它关系到字符串的存储、传输和显示。在本文中,我们将详细讲解Java中字符编码格式的相关知识,以及如何在编写Java程序时正确地处理字符编码。 字符编码的基础知识 字符编码是将字符映射到二进制数据的过程。在计算机中,所有的数据都是以二进制存储的,因此字符也需要经过编码才能被计算机识别和…

    Java 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部