以下是基于Java实现WebSocket的完整攻略。
WebSocket的背景与基本概念
WebSocket是一种在单个TCP连接上进行全双工通信的协议。这意味着服务器可以向客户端发送消息,而客户端也可以向服务器发送消息,并且在连接建立后,双方可以随时发送消息。
WebSocket协议基于HTTP协议进行握手。握手后,通信双方就可以像Socket一样相互发送数据。WebSocket在Web应用程序中的应用非常广泛,比如实时数据的推送、在线游戏、聊天等。
基于Java实现WebSocket代码示例
后端代码实现
- 首先,需要添加WebSocket依赖。Spring Boot中可以使用以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- 创建一个WebSocket处理器,继承自
TextWebSocketHandler
,并实现其方法
public class MyWebSocketHandler extends TextWebSocketHandler {
// 接收消息时触发的方法
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message)
throws Exception {
// 获取客户端发送的消息
String content = message.getPayload();
// 给客户端发送一个消息
session.sendMessage(new TextMessage("服务器收到了你的消息:" + content));
}
}
- 添加WebSocket处理器到Spring容器中。在Spring Boot中,可以在启动类上加上
@EnableWebSocket
注解,并重写registerWebSocketHandlers
方法:
@SpringBootApplication
@EnableWebSocket
public class Application implements WebSocketConfigurer {
// 添加WebSocket处理器
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new MyWebSocketHandler(), "/my-websocket");
}
}
- 单元测试。创建一个类,使用Spring Test框架进行单元测试,在测试方法中使用
WebSocketClient
发送一个消息,并验证是否收到了服务器的回复。
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ApplicationTests {
// 客户端连接
private WebSocketClient webSocketClient = new StandardWebSocketClient();
// 测试WebSocket
@Test
public void testWebSocket() throws Exception {
URI uri = new URI("ws://localhost:" + port + "/my-websocket");
WebSocketSession session = webSocketClient.doHandshake(new MyWebSocketHandler(), uri).get();
session.sendMessage(new TextMessage("Hello, WebSocket!"));
Thread.sleep(1000);
assertThat(receivedMessages).contains("服务器收到了你的消息:Hello, WebSocket!");
}
}
前端代码实现
- 在HTML页面中引入
sockjs
和stomp
,并创建一个WebSocket连接:
<script src="//cdn.jsdelivr.net/sockjs/1.0.1/sockjs.min.js"></script>
<script src="//cdn.jsdelivr.net/stomp.js/2.3.3/stomp.min.js"></script>
<script>
var socket = new SockJS('/my-websocket');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function(message) {
console.log('Received: ' + message.body);
});
});
</script>
- 在JavaScript代码中可以直接使用
stompClient
发送消息,比如:
stompClient.send("/app/hello", {}, "Hello, WebSocket!");
示例说明
实时聊天室
在前端页面中,可以使用文本框输入聊天内容,按下回车键发送给服务器,在服务器中把这个消息发送给所有连接上的客户端。
在后端代码中,可以使用一个Map来存储所有连接上的WebSocketSession,并在收到消息时,遍历Map,把消息发送给所有连接上的客户端。
实时交易后台
在前端页面中,可以使用WebSocket订阅实时股票行情,服务器每隔一段时间给客户端发送最新的行情数据。
在后端代码中,可以使用ScheduledExecutorService定时从股票行情API中获取最新的股票数据,并把数据发送给所有连接上的客户端。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于java实现websocket代码示例 - Python技术站