如何使用websocket 主动响应客户端
2015-04-07 16:20
471 查看
demo作者:liuxing(2014-12-26 02:32)
无意中看到了有关websocket的内容,觉得非常有必要学习一下,自己最近也在为自己的网页游戏通讯做交互,觉得websocket真的可以解决ajax请求服务器频繁和服务器无法响应的问题.
遇到的问题:
1.onmessage onopen onerror onclose 这些方法,一看就会用,但是很蛋疼,这些方法都是在客户端响应你的时候去响应他,你不可能把服务器通讯的方法写在里面,为此我研究 了一整晚,找到这个demo
解决方案:可以在on open的时候开始把每一个客户端的session存入一个数列中或者MAP,看个人爱好吧.然后需要调用的时候直接取到这个session
Session session=SessionUtils.clients.get(“100650920”);
session.getBasicRemote().sendText(text); 这里还有getAsyncRemote().sendtext();想用哪种自己选啦,核心解决了,其他应该都会直接放人家DEMO把
Testing websockets
无意中看到了有关websocket的内容,觉得非常有必要学习一下,自己最近也在为自己的网页游戏通讯做交互,觉得websocket真的可以解决ajax请求服务器频繁和服务器无法响应的问题.
遇到的问题:
1.onmessage onopen onerror onclose 这些方法,一看就会用,但是很蛋疼,这些方法都是在客户端响应你的时候去响应他,你不可能把服务器通讯的方法写在里面,为此我研究 了一整晚,找到这个demo
解决方案:可以在on open的时候开始把每一个客户端的session存入一个数列中或者MAP,看个人爱好吧.然后需要调用的时候直接取到这个session
Session session=SessionUtils.clients.get(“100650920”);
session.getBasicRemote().sendText(text); 这里还有getAsyncRemote().sendtext();想用哪种自己选啦,核心解决了,其他应该都会直接放人家DEMO把
package com.byteslounge.websockets; import javax.websocket.Session; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 功能说明:用来存储业务定义的sessionId和连接的对应关系 * 利用业务逻辑中组装的sessionId获取有效连接后进行后续操作 * 作者:liuxing(2014-12-26 02:32) */ public class SessionUtils { public static Map<String, Session> clients = new ConcurrentHashMap<>(); public static void put(String sessionID, Session session){ clients.put( sessionID,session); } public static Session get(String sessionID, int userCode){ return clients.get(sessionID); } public static void remove(String sessionID, int userCode){ clients.remove(sessionID); } /** * 判断是否有连接 * @param relationId * @param userCode * @return */ public static boolean hasConnection(String sessionID, int userCode) { return clients.containsKey(sessionID); } /** * 组装唯一识别的key * @param relationId * @param userCode * @return */ public static String getKey(String relationId, int userCode) { return relationId +"_"+ userCode; } }
package com.byteslounge.websockets; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; /** * 功能说明:websocket处理类, 使用J2EE7的标准 * 切忌直接在该连接处理类中加入业务处理代码 * 作者:liuxing(2014-11-14 04:20) */ //relationId和userCode是我的业务标识参数,websocket.ws是连接的路径,可以自行定义 @ServerEndpoint("/cha") public class WebsocketEndPoint { private static Log log = LogFactory.getLog(WebsocketEndPoint.class); /** * 打开连接时触发 * @param relationId * @param userCode * @param session */ @OnOpen public void onOpen( Session session){ log.info("Websocket Start Connecting:"+session.getId() ); SessionUtils.put("100650920", session); } /** * 收到客户端消息时触发 * @param relationId * @param userCode * @param message * @return */ @OnMessage public String onMessage(String message,Session session) { System.out.println(SessionUtils.clients.get("100650920").isOpen()+"状态"); return"Got your message ("+ message +").Thanks !"; } /** * 异常时触发 * @param relationId * @param userCode * @param session */ @OnError public void onError(@PathParam("relationId") String relationId, @PathParam("userCode") int userCode, Throwable throwable, Session session) { log.info("Websocket Connection Exception:"+ SessionUtils.getKey(relationId, userCode)); log.info(throwable.getMessage(), throwable); SessionUtils.remove(relationId, userCode); } /** * 关闭连接时触发 * @param relationId * @param userCode * @param session */ @OnClose public void onClose(@PathParam("relationId") String relationId, @PathParam("userCode") int userCode, Session session) { log.info("Websocket Close Connection:"+ SessionUtils.getKey(relationId, userCode)); SessionUtils.remove(relationId, userCode); } } ```' ---------------------------------------------------------------------------------------- <div class="se-preview-section-delimiter"></div>
Testing websockets
相关文章推荐
- WebSocket服务端主动向客户端推送数据在项目的实际使用
- 使用js脚本如何进行客户端验证时出现乱码怎么办?
- 如何:使用回调方法实现异步 Web 服务客户端
- 绝对酷,如何解决asp.net中javascript脚本的问题(使用服务器控件执行客户端脚本)
- Smart Client学习笔记(7) 使用多线程创建高响应智能客户端应用程序
- 如何通过在 SQL Server 的早期版本使用客户端工具连接到的 SQL Server 2005 或 SQL Server 2000 命名实例
- 如何使用来自 ASP.NET 的客户端证书调用 Web 服务
- 客户端如何使用无人值守安装
- SmartClient学习(四):使用多线程创建高响应智能客户端应用程序
- 如何使用客户端配置工具
- 如何使用C++响应COM事件处理
- [原创]用户控件中使用Js,如何在客户端引用用户控件中某个控件的ID
- 在vc中使用MapX时,如何在视图类中响应鼠标消息
- AJAX,使用XMLHttpRequest接受客户端的提交,并发送响应
- 如何使用SQL Server中的客户端配置工具
- asp.net TreeView安装、使用(如何将TreeView打包发布)(带CheckBox选择框的TreeView的初始化,TreeView客户端操作:选择父节点后自动选择所有子节点,子节点选择后自动选择父节点)(TreeView节点精确定位)
- asp.net TreeView安装、使用(如何将TreeView打包发布)(带CheckBox选择框的TreeView的初始化,TreeView客户端操作:选择父节点后自动选择所有子节点,子节点选择后自动选择父节点)(TreeView节点精确定位)
- asp.net TreeView安装、使用(如何将TreeView打包发布)(带CheckBox选择框的TreeView的初始化,TreeView客户端操作:选择父节点后自动选择所有子节点,子节点选择后自动选择父节点)(TreeView节点精确定位)
- 如何使用struts做统一的客户端验证[转载]
- 如何使用命令行删除TFS客户端无用的Workspace