社区
Web 开发
帖子详情
关于websocket 的连接问题
hupuer
2018-02-28 09:36:24
今天刚接触 websocket ,使用websocket一连接到服务器 马上就断开了。
这是什么问题啊。
...全文
816
2
打赏
收藏
关于websocket 的连接问题
今天刚接触 websocket ,使用websocket一连接到服务器 马上就断开了。 这是什么问题啊。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xiongdejun
2018-03-01
打赏
举报
回复
把代码贴出来 鬼知道你怎么写的啊,
hupuer
2018-03-01
打赏
举报
回复
引用 1 楼 xiongdejun 的回复:
把代码贴出来 鬼知道你怎么写的啊,
jsp部分
<%@ 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); } } }
WebSocket
测试工具
这是一个测试
WebSocket
的一个小工具,分别有两个
连接
WebSocket
服务端的地址输入,对应的相同的发送按钮,以及有对应的发送消息框和接收消息框!
WebSocket
无法
连接
问题
rosbridge
连接
不稳定
问题
问题
描述: Windows端web
连接
Ubuntu端rosbridge server,出现有时能连上有时连不上的
问题
。 最近一次发生
连接
不上的情况是,前一天可以
连接
成功,第二天,重新启动rosbridge server,从Windows端建立
连接
时
连接
不上。 可能原因 网络
连接
方式?最近一次发现
问题
,Windows是有线
连接
方式,自动分配IP,Ubuntu是无线
连接
方式。将Ubuntu端切换为有线
连接
方式后,
连接
成功。 rosbridge本身的
问题
? 可以ping通,无
微信小程序-
WebSocket
(Workerman-PHP)即时通讯
webSocket
连接
数太多启动不起来怎么办?
WebSocket
连接
数过多
关于
WebSocket
连接
报404的
问题
关于
WebSocket
连接
报404的
问题
我的项目解决办法是:我是用springboot内置的Tomcat启动的(这种方式出现的
问题
多),所以在代码里少了这个配置文件 @Configuration public class
WebSocket
Config { /** * ServerEndpointExporter 作用 * * 这个Bean会自动注册使用@ServerEndpoint注解声明的
websocket
endpoint * * @
Web 开发
81,092
社区成员
341,716
社区内容
发帖
与我相关
我的任务
Web 开发
Java Web 开发
复制链接
扫一扫
分享
社区描述
Java Web 开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章