MST

星途 面试题库

面试题:网络编程之Java WebSocket API基础应用

请简述在Java中使用WebSocket API创建一个简单的实时消息推送服务端的主要步骤,包括如何处理连接建立、消息接收和连接关闭事件,并且说明需要用到哪些核心类和方法。
18.6万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试
  1. 引入依赖
    • 在Maven项目的pom.xml中添加Java WebSocket相关依赖,例如Tomcat的WebSocket依赖:
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-websocket</artifactId>
        <version>9.0.65</version>
    </dependency>
    
  2. 创建WebSocket配置类
    • 配置WebSocket的端点。例如:
    import javax.websocket.server.ServerEndpointConfig;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.ConcurrentMap;
    
    public class WebSocketConfig {
        private static final ConcurrentMap<String, ServerEndpointConfig> configs = new ConcurrentHashMap<>();
    
        public static ServerEndpointConfig getEndpointConfig(String path) {
            return configs.get(path);
        }
    
        public static void registerEndpoint(String path, ServerEndpointConfig config) {
            configs.putIfAbsent(path, config);
        }
    }
    
  3. 创建WebSocket服务端端点类
    • 处理连接建立事件:使用@OnOpen注解的方法处理连接建立。
    • 处理消息接收事件:使用@OnMessage注解的方法处理消息接收。
    • 处理连接关闭事件:使用@OnClose注解的方法处理连接关闭。
    • 核心类和方法
      • 核心类javax.websocket.Endpoint及其实现类,javax.websocket.Sessionjavax.websocket.server.ServerEndpoint
      • 核心方法
        • @OnOpen注解的方法,如:
        @OnOpen
        public void onOpen(Session session) {
            // 在这里可以将新连接的session保存到一个集合中,以便后续推送消息
            System.out.println("新连接建立: " + session.getId());
        }
        
        • @OnMessage注解的方法,如:
        @OnMessage
        public void onMessage(String message, Session session) {
            // 处理接收到的消息
            System.out.println("收到消息: " + message + " 来自 " + session.getId());
            // 可以根据消息内容进行相应处理,也可以向其他客户端推送消息
        }
        
        • @OnClose注解的方法,如:
        @OnClose
        public void onClose(Session session) {
            // 在这里可以将关闭的session从保存的集合中移除
            System.out.println("连接关闭: " + session.getId());
        }
        
    • 示例完整端点类:
    import javax.websocket.*;
    import javax.websocket.server.ServerEndpoint;
    import java.io.IOException;
    
    @ServerEndpoint("/websocket")
    public class WebSocketServer {
        @OnOpen
        public void onOpen(Session session) {
            System.out.println("新连接建立: " + session.getId());
        }
    
        @OnMessage
        public void onMessage(String message, Session session) {
            System.out.println("收到消息: " + message + " 来自 " + session.getId());
            try {
                session.getBasicRemote().sendText("已收到你的消息: " + message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @OnClose
        public void onClose(Session session) {
            System.out.println("连接关闭: " + session.getId());
        }
    }
    
  4. 部署WebSocket服务
    • 如果是在Servlet容器中(如Tomcat),可以将包含上述代码的项目打包成WAR文件并部署到Tomcat等容器中。如果是使用嵌入式Tomcat,可参考以下代码启动:
    import org.apache.catalina.startup.Tomcat;
    import javax.servlet.ServletException;
    import java.io.File;
    import java.io.IOException;
    
    public class EmbeddedTomcatServer {
        public static void main(String[] args) throws ServletException, IOException {
            Tomcat tomcat = new Tomcat();
            tomcat.setPort(8080);
            String webappDirLocation = "src/main/webapp/";
            File webappDir = new File(webappDirLocation);
            tomcat.addWebapp("/", webappDir.getAbsolutePath());
            tomcat.start();
            tomcat.getServer().await();
        }
    }
    

这样就可以创建一个简单的Java WebSocket实时消息推送服务端。