面试题答案
一键面试- 引入依赖:
- 在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>
- 在Maven项目的
- 创建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); } }
- 创建WebSocket服务端端点类:
- 处理连接建立事件:使用
@OnOpen
注解的方法处理连接建立。 - 处理消息接收事件:使用
@OnMessage
注解的方法处理消息接收。 - 处理连接关闭事件:使用
@OnClose
注解的方法处理连接关闭。 - 核心类和方法:
- 核心类:
javax.websocket.Endpoint
及其实现类,javax.websocket.Session
,javax.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()); } }
- 处理连接建立事件:使用
- 部署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实时消息推送服务端。