随着互联网技术的快速发展,实时通信在许多场景下变得越来越重要。例如在线聊天、股票行情推送、实时游戏等都需要服务器和客户端之间的实时数据交互。传统的HTTP请求-响应模型无法满足这种需求,而WebSocket协议提供了一种全双工的通信方式,使得服务器和客户端可以在连接建立后随时发送数据。
WebSocket是一种网络通信协议,它允许服务端主动向客户端推送信息,客户端也可以主动向服务端发送信息,是真正的双向平等对话,属于服务器推送技术的一种。与传统的HTTP不同,WebSocket在建立连接之后会保持长连接状态,从而避免了频繁创建和销毁连接所带来的开销。
Java EE 7引入了对WebSocket的支持,通过javax.websocket
包下的类和注解,我们可以很方便地实现WebSocket功能。
首先,我们需要定义一个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;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@ServerEndpoint("/websocket")
public class ChatServer {
// 存储所有连接的客户端Session
private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
System.out.println("New connection: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Message from " + session.getId() + ": " + message);
// 广播消息给所有连接的客户端
synchronized (sessions) {
for (Session s : sessions) {
if (s.isOpen()) {
try {
s.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
@OnClose
public void onClose(Session session) {
sessions.remove(session);
System.out.println("Connection closed: " + session.getId());
}
@OnError
public void onError(Session session, Throwable throwable) {
System.out.println("Error on session " + session.getId());
throwable.printStackTrace();
}
}
如果你使用的是像Tomcat这样的应用服务器,确保你的pom.xml
(如果是Maven项目)中包含了以下依赖:
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
然后在web.xml
中添加如下配置:
<listener>
<listener-class>org.apache.catalina.startup.ContextConfig</listener-class>
</listener>
<servlet>
<servlet-name>javax.websocket.server.ServerContainer</servlet-name>
<servlet-class>org.apache.tomcat.websocket.server.WsSci</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>javax.websocket.server.ServerContainer</servlet-name>
<url-pattern>/websocket/*</url-pattern>
</servlet-mapping>
你可以使用JavaScript来测试WebSocket功能。下面是一个简单的HTML页面,用于连接到WebSocket服务器并发送消息。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Test</title>
</head>
<body>
<h1>WebSocket Test</h1>
<div id="messages"></div>
<input type="text" id="messageInput" placeholder="Type a message...">
<button onclick="sendMessage()">Send</button>
<script>
var ws = new WebSocket("ws://localhost:8080/websocket");
ws.onopen = function() {
console.log("Connected to server");
};
ws.onmessage = function(event) {
var messagesDiv = document.getElementById("messages");
var newMessage = document.createElement("div");
newMessage.textContent = event.data;
messagesDiv.appendChild(newMessage);
};
function sendMessage() {
var input = document.getElementById("messageInput");
ws.send(input.value);
input.value = "";
}
</script>
</body>
</html>