1.3 补充说明
(1)在WebSocket实现过程中,尤其是通过“@ServerEndpoint”实现的时候,可能会出现注入失败的问题,即注入的Bean为null的问题。可以通过手动注入的方式来解决,需要改造实现类和SpringBoot启动类,如下:
@ServerEndpoint("testWebsocket")
@RestController
public class WebSocketController {
private TestService testService;
private static ApplicationContext applicationContext;
@OnOpen
public void onOpen(Session session) {
testService = applicationContext.getBean(TestService.class);
}
@OnClose
public void onClose() {}
@OnMessage
public void onMessage(String message, Session session) {}
@OnError
public void onError(Session session, Throwable error) {}
public static void setApplicationContext(ApplicationContext applicationContext) {
WebSocketController.applicationContext = applicationContext;
}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import WebSocketController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
// SpringApplication.run(Application.class, args);
SpringApplication springApplication = new SpringApplication(Application.class);
ConfigurableApplicationContext configurableApplicationContext = springApplication.run(args);
WebSocketController.setApplicationContext(configurableApplicationContext); // 解决WebSocket不能注入的问题
}
}
2. 客户端的实现,我尝试了html和java WebSocketClient两种方式
2.1 html实现
<!DOCTYPE html>
<html>
<head>
<title>WebSocket示例</title>
<meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport' />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<input id="text" type="text"/>
<button onclick="send()">发送消息</button>
<hr/>
<button onclick="closeWebSocket()">关闭WebSocket连接</button>
<hr/>
<div id="message"></div>
</body>
<script type="text/javascript">
var websocket = null;
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
// 不带参数的写法
websocket = new WebSocket("ws://127.0.0.1:18080/testWebsocket");
// 通过路径传递参数的方法(服务端采用第一种方法"@ServerEndpoint"实现)
websocket = new WebSocket("ws://127.0.0.1:18080/testWebsocket/23/Lebron");
// 通过类似GET请求方式传递参数的方法(服务端采用第二种方法"WebSocketHandler"实现)
websocket = new WebSocket("ws://127.0.0.1:18080/testWebsocket?id=23&name=Lebron");
}
else {
alert('当前浏览器 Not support websocket')
}
//连接发生错误的回调方法
websocket.onerror = function () {
setMessageInnerHTML("WebSocket连接发生错误");
};
//连接成功建立的回调方法
websocket.onopen = function () {
setMessageInnerHTML("WebSocket连接成功");
}
//接收到消息的回调方法
websocket.onmessage = function (event) {
setMessageInnerHTML(event.data);
}
//连接关闭的回调方法
websocket.onclose = function () {
setMessageInnerHTML("WebSocket连接关闭");
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
closeWebSocket();
}
//将消息显示在网页上
function setMessageInnerHTML(innerHTML) {
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
//发送消息
function send() {
var message = document.getElementById('text').value;
websocket.send(message);
}
</script>
</html>
2.2 Java WebSocketClient实现
(1)WebSocketClient 实现类
import java.net.URI;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.handshake.ServerHandshake;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestWebSocketClient extends WebSocketClient {
private final Logger LOGGER = LoggerFactory.getLogger(TestWebSocketClient.class);
public TestWebSocketClient(URI serverUri) {
super(serverUri);
}
public TestWebSocketClient(URI serverUri, Draft protocolDraft) {
super(serverUri, protocolDraft);
}
@Override
public void onOpen(ServerHandshake serverHandshake) {
LOGGER.info("Open a WebSocket connection on client. ");
}
@Override
public void onClose(int arg0, String arg1, boolean arg2) {
LOGGER.info("Close a WebSocket connection on client. ");
}
@Override
public void onMessage(String msg) {
LOGGER.info("WebSocketClient receives a message: " + msg);
}
@Override
public void onError(Exception exception) {
LOGGER.error("WebSocketClient exception. ", exception);
}
}
(2)WebSocketClient 发送数据
String serverUrl = "ws://127.0.0.1:18080/testWebsocket"
URI recognizeUri = new URI(serverUrl);
client = new TestWebSocketClient(recognizeUri, new Draft_6455());
client.connect();
client.send("This is a message from client. ");