今天刚接触 websocket ,使用websocket一连接到服务器 马上就断开了。
这是什么问题啊。
这是什么问题啊。
解决方案 »
- 安装mysql第四步(apply security settings)错误1045,失败,急救!!防火墙已关闭,重装不管。
- DWZ在myeclipse中的配置问题,很急。。。
- common-net上传文件中文问题
- 这段代码是什么意思啊?看的我都晕掉了??
- 关于将字符串插入到java.sql.Blob类型里面会出现乱码,并且显示不出来~!
- 求救,stuts中的错误返回不了错误页面
- 急!!用struts做的网站首页应该怎么办啊.
- jsp文件上传问题,大家帮忙看看
- 200分,请高手帮忙!linux上的图片处理问题。
- 为什么tomcat 4.0和动态域名软件2.0不能正常配合使用?(在线等待中...)
- 如何国际化后台日志输出
- 各位大神老师能否帮忙修改一下controller层代码,实现用户在用一时间只能进行一次接口的方法
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% String path = request.getContextPath();%>
<% String socketPath = request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>当前登录用户:${userName}</h2>
消息:<input type="text" id="send">
<button onclick="sendMessage()">发送</button></body>
<script src="${pageContext.request.contextPath}/resources/js/jquery.min.js"></script>
<script type="text/javascript"> var socketPath = "<%=socketPath%>";
var webSocket = new WebSocket("ws://"+socketPath+"/ws");
webSocket.onopen = function(event){
console.log("连接成功"); console.log(event);
alert(webSocket.readyState);
};
webSocket.onerror = function(event){
console.log("连接失败");
console.log(event);
};
webSocket.onclose = function(event){
console.log("Socket连接断开");
console.log(event);
};
webSocket.onmessage = function(event){
//接受来自服务器的消息
//...
var message = JSON.parse(event.data);//将数据解析成JSON形式
$("#send").val(message.messageText);
};
function sendMessage() {
var sendUid = 1;
var sendName = "xiaoma";
var toId = 2;
var data = {};//新建data对象,并规定属性名与相应的值
data['fromId'] = sendUid;
data['fromName'] = sendName;
data['toId'] = toId;
data['messageText'] = $("#send").val();
webSocket.send(JSON.stringify(data));//将对象封装成JSON后发送至服务器
};
</script>
</html>
配置文件 MyWebSocketConfig
@Component
@EnableWebSocket
public class MyWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
@Autowired
private MyWebSocketHandler handler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
//添加websocket处理器,添加握手拦截器
webSocketHandlerRegistry.addHandler(handler, "/ws").addInterceptors(new MyHandShakeInterceptor()); //添加websocket处理器,添加握手拦截器
webSocketHandlerRegistry.addHandler(handler, "/ws/sockjs").addInterceptors(new MyHandShakeInterceptor()).withSockJS();
}
}
拦截器 MyHandShakeInterceptor.java
public class MyHandShakeInterceptor implements HandshakeInterceptor { @Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> map) throws Exception {
System.out.println("Websocket:用户[ID:" + ((ServletServerHttpRequest) serverHttpRequest).getServletRequest().getSession(false).getAttribute("user") + "]已经建立连接");
if (serverHttpRequest instanceof ServletServerHttpRequest) {
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) serverHttpRequest;
HttpSession session = servletRequest.getServletRequest().getSession(false);
// 标记用户
User user = (User) session.getAttribute("user");
if(user!=null){
map.put("uid", user.getId());//为服务器创建WebSocketSession做准备
System.out.println("用户id:"+user.getId()+" 被加入");
}else{
System.out.println("user为空");
return false;
}
}
return true;
} @Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { }
}
消息处理 MyWebSocketHandler.java
@Component
public class MyWebSocketHandler implements WebSocketHandler { //当MyWebSocketHandler类被加载时就会创建该Map,随类而生
public static final Map<Integer, WebSocketSession> userSocketSessionMap; static {
userSocketSessionMap = new HashMap<Integer, WebSocketSession>();
} //握手实现连接后
public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
int uid = (Integer) webSocketSession.getAttributes().get("uid");
if (userSocketSessionMap.get(uid) == null) {
userSocketSessionMap.put(uid, webSocketSession);
}
System.out.println("握手实现连接后");
} //发送信息前的信息处理
public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
if(webSocketMessage.getPayloadLength()==0)return; //得到Socket通道中的数据并转化为Message对象
Message msg=new Gson().fromJson(webSocketMessage.getPayload().toString(),Message.class); Timestamp now = new Timestamp(System.currentTimeMillis());
msg.setMessageDate(now);
//发送Socket信息
sendMessageToUser(msg.getToId(), new TextMessage(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create().toJson(msg)));
}
@Override
public void handleTransportError(WebSocketSession webSocketSession, Throwable exception) throws Exception { } public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
System.out.println("WebSocket:"+webSocketSession.getAttributes().get("uid")+"close connection");
Iterator<Map.Entry<Integer,WebSocketSession>> iterator = userSocketSessionMap.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<Integer,WebSocketSession> entry = iterator.next();
if(entry.getValue().getAttributes().get("uid")==webSocketSession.getAttributes().get("uid")){
userSocketSessionMap.remove(webSocketSession.getAttributes().get("uid"));
System.out.println("WebSocket in staticMap:" + webSocketSession.getAttributes().get("uid") + "removed");
}
}
} @Override
public boolean supportsPartialMessages() {
return false;
} //发送信息的实现
public void sendMessageToUser(int uid, TextMessage message)
throws IOException {
WebSocketSession session = userSocketSessionMap.get(uid);
if (session != null && session.isOpen()) {
session.sendMessage(message);
}
}
}