最近需要完成一個javaweb項目顾瞪,但是沒有和數(shù)據(jù)庫連接而是通過websocket通訊實現(xiàn)和服務(wù)器端數(shù)據(jù)交互。我搜了好多猪狈,網(wǎng)上大部分都是通過頁面websocket連接本地服務(wù)器或連接異地服務(wù)器箱沦,但是這些都把連接地址暴露在了外面,不是我想要的雇庙。本人希望websocket連接谓形、數(shù)據(jù)處理等都是在java后端完成的,結(jié)合網(wǎng)上的一些參考資料終于實現(xiàn)了此功能疆前。
這里有個比較好的Java后端WebSocket的Tomcat實現(xiàn)栗子寒跳,不過是將本地tomcat作為服務(wù)器,websocket連接也暴露在頁面竹椒。
接下來講講本人的實現(xiàn)童太,本人實現(xiàn)是使用springMVC框架,但是我們只用控制層即可:
Eclipse + JDK1.8 + tomcat8
1胸完、首先我在控制層包中創(chuàng)建一個WebSocketConnect類书释,在此類中實現(xiàn)websocket的連接方法。注意需要事先引入tomcat服務(wù)器lib文件夾中的websocket-api.jar和tomcat-websocket.jar赊窥,jsp-api.jar爆惧、servlet-api.jar,后面兩個可根據(jù)需要引入锨能。
//WebSocketClient連接publicclassWebSocketConnect{//websocket建立連接 publicvoidClientConnect(String userInfo,HttpServletRequest request){ HttpSession session = request.getSession();try{ WebSocketClient webSocketClient =newWebSocketClient(newURI("ws://服務(wù)器ip地址:8080/websocket"),newDraft_17()) {//打開鏈接@OverridepublicvoidonOpen(ServerHandshake shake){? System.out.println("握手检激。。腹侣。");? }//這個方法自動接收服務(wù)器發(fā)過來的信息,直接在此處調(diào)用自己寫的方法即可.本人將消息存入到session中叔收,別處可以監(jiān)聽,然后取出再清空@OverridepublicvoidonMessage(String msgString){ System.out.println("websocket返回消息"+ msgString);? }//客戶端發(fā)生錯誤,即將關(guān)閉!@OverridepublicvoidonError(Exception e){? System.out.println("發(fā)生錯誤已關(guān)閉");? }//關(guān)閉鏈接@OverridepublicvoidonClose(intarg0, String arg1, boolean arg2){? System.out.println("鏈接已關(guān)閉");? } };? webSocketClient.connect(); System.out.println("建立websocket連接");//將用戶websocket連接對象存入session中傲隶,別處用取出使用即可饺律。session.setAttribute("webSocketClient", webSocketClient); }catch(URISyntaxException e) { e.printStackTrace(); } }//關(guān)閉websocket連接publicvoidcloseWebSocket(HttpServletRequest request){ HttpSession session = request.getSession(); WebSocketClient webSocketClient = (WebSocketClient) session.getAttribute("webSocketClient"); webSocketClient.close(); System.out.println("websocket主動關(guān)閉!"); }}
2跺株、websocket連接方法已經(jīng)完成了复濒,下面我們就只需在用的地方調(diào)用即可脖卖,此處為我在用戶登錄控制器調(diào)用的栗子。
//實例化對象 WebSocketConnect webSocketConnect =newWebSocketConnect();/*用戶登錄*/@RequestMapping(value ="/login",method = RequestMethod.POST,produces="text/html;charset=UTF-8;")@ResponseBody//此注解不能省略 否則ajax無法接受返回值publicvoidlogin(HttpServletRequest request,HttpServletResponse response)throwsUnsupportedEncodingException{//調(diào)用對象webSocketConnect中連接方法webSocketConnect.ClientConnect(request);}
3巧颈、現(xiàn)在websocket已經(jīng)建立連接了畦木,那么下面我們需要去發(fā)送消息了
//從session中取出用戶登錄的連接對象,實現(xiàn)發(fā)送消息WebSocketClient webSocketClient = (WebSocketClient) session.getAttribute("webSocketClient");Stringmessage= “狼來了”砸泛; webSocketClient.send(message);
4十籍、最后退出系統(tǒng)時調(diào)用close方法即可。
//方式一:使用對象調(diào)用webSocketConnect類中寫的closeWebSocket方法唇礁。webSocketConnect.closeWebSocket(request);//方式二:從session中取出連接對象勾栗,直接調(diào)用close()方法。WebSocketClient webSocketClient = (WebSocketClient) session.getAttribute("webSocketClient");
歡迎工作一到五年的Java工程師朋友們加入Java技術(shù)交流:585550789