最近须要完成一个javaweb项目,可是没有和数据库链接而是经过websocket通信实现和服务器端数据交互。我搜了好多,网上大部分都是经过页面websocket链接本地服务器或链接异地服务器,可是这些都把链接地址暴露在了外面,不是我想要的。本人但愿websocket链接、数据处理等都是在java后端完成的,结合网上的一些参考资料终于实现了此功能。html
这里有个比较好的Java后端WebSocket的Tomcat实现栗子,不过是将本地tomcat做为服务器,websocket链接也暴露在页面,可是有必定的参考价值。http://www.javashuo.com/article/p-fweitwrn-e.htmljava
接下来说讲本人的实现,本人实现是使用springMVC框架,可是咱们只用控制层便可:web
Eclipse + JDK1.8 + tomcat8ajax
一、首先我在控制层包中建立一个WebSocketConnect类,在此类中实现websocket的链接方法。注意须要事先引入tomcat服务器lib文件夹中的websocket-api.jar和tomcat-websocket.jar,jsp-api.jar、servlet-api.jar,后面两个可根据须要引入。spring
//WebSocketClient链接 public class WebSocketConnect {//websocket创建链接 public void ClientConnect(String userInfo,HttpServletRequest request) { HttpSession session = request.getSession(); try { WebSocketClient webSocketClient = new WebSocketClient(new URI("ws://服务器ip地址:8080/websocket"),new Draft_17()) {
//打开连接 @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链接"); //将用户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主动关闭!"); } }
二、websocket链接方法已经完成了,下面咱们就只需在用的地方调用便可,此处为我在用户登陆控制器调用的栗子。数据库
//实例化对象 WebSocketConnect webSocketConnect = new WebSocketConnect(); /*用户登陆*/ @RequestMapping(value = "/login",method = RequestMethod.POST,produces="text/html;charset=UTF-8;") @ResponseBody//此注解不能省略 不然ajax没法接受返回值 public void login(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException{ //调用对象webSocketConnect中链接方法 webSocketConnect.ClientConnect(request); }
三、如今websocket已经创建链接了,那么下面咱们须要去发送消息了后端
//从session中取出用户登陆的链接对象,实现发送消息 WebSocketClient webSocketClient = (WebSocketClient) session.getAttribute("webSocketClient"); String message= “狼来了”; webSocketClient.send(message);
四、最后退出系统时调用close方法便可。api
//方式一:使用对象调用webSocketConnect类中写的closeWebSocket方法。 webSocketConnect.closeWebSocket(request); //方式二:从session中取出链接对象,直接调用close()方法。 WebSocketClient webSocketClient = (WebSocketClient) session.getAttribute("webSocketClient");
注:原创做品,欢迎关注,一块儿学习一块儿进步!tomcat