下面是实现Java WebSocket服务端的完整攻略,包括示例说明。
准备工作
在开始编写WebSocket服务端代码之前,需要先确保拥有以下条件:
- Java开发环境,最好使用JDK8或以上版本。
- 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技术站