最近須要完成一個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