场景
在管理平台中需要对前端传来的远程控制消息进行处理并传递到中控服务,中控服务再将控制消息转发给被控设备,从而实现远程控制
在这个场景中需要在后端创建一个WebSocket的长连接实现后端向中控服务推送消息
出现的问题
org.java_websocket.exceptions.WebsocketNotConnectedException: null
思路
1、先检查url是否能连通 , 测试连接
2、如果连接也没有问题,在代码中增加一个等待连接状态循环
while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN))
{
System.out.println("connecting...");
}
完整代码
public class WebSocketConnect {
//websocket建立连接
public void ClientConnect(String userInfo, HttpServletRequest request) {
HttpSession session = request.getSession();
try {
WebSocketClient webSocketClient = new WebSocketClient(new URI("ws://192.168.1.36:8568/Chat?id=1005020&r=t"), new Draft_6455()) {
//打开链接
//
@Override
public void onOpen(ServerHandshake shake) {
System.out.println("握手。。。");
}//这个方法自动接收服务器发过来的信息,直接在此处调用自己写的方法即可.本人将消息存入到session中,别处可以监听,然后取出再清空
@Override
public void onMessage(String msgString) {
System.out.println("websocket返回消息" + msgString);
}
// 客户端发生错误,即将关闭!
@Override
public void onError(Exception e) {
System.out.println("发生错误已关闭");
}
// 关闭链接
@Override
public void onClose(int arg0, String arg1, boolean arg2) {
System.out.println("链接已关闭");
}
};
webSocketClient.connect();
System.out.println("建立websocket连接");
while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN))
{
System.out.println("connecting...");
}
System.out.println("###### connect-state open ######");
// 将用户websocket连接对象存入session中,别处用取出使用即可。
session.setAttribute("webSocketClient", webSocketClient);
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
//关闭websocket连接
public void closeWebSocket(HttpServletRequest request) {
HttpSession session = request.getSession();
WebSocketClient webSocketClient = (WebSocketClient) session.getAttribute("webSocketClient");
webSocketClient.close();
System.out.println("websocket主动关闭!");
}
}