javaweb + websocket實現客戶端


  最近需要完成一個javaweb項目,但是沒有和數據庫連接而是通過websocket通訊實現和服務器端數據交互。我搜了好多,網上大部分都是通過頁面websocket連接本地服務器或連接異地服務器,但是這些都把連接地址暴露在了外面,不是我想要的。本人希望websocket連接、數據處理等都是在java后端完成的,結合網上的一些參考資料終於實現了此功能。

 這里有個比較好的Java后端WebSocket的Tomcat實現栗子,不過是將本地tomcat作為服務器,websocket連接也暴露在頁面,但是有一定的參考價值。https://www.cnblogs.com/xdp-gacl/p/5193279.html

接下來講講本人的實現,本人實現是使用springMVC框架,但是我們只用控制層即可:

Eclipse + JDK1.8 + tomcat8

 1、首先我在控制層包中創建一個WebSocketConnect類,在此類中實現websocket的連接方法。注意需要事先引入tomcat服務器lib文件夾中的websocket-api.jar和tomcat-websocket.jar,jsp-api.jar、servlet-api.jar,后面兩個可根據需要引入。

//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主動關閉!"); } }

2、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);
}

3、現在websocket已經建立連接了,那么下面我們需要去發送消息了

//從session中取出用戶登錄的連接對象,實現發送消息
WebSocketClient webSocketClient = (WebSocketClient) session.getAttribute("webSocketClient");
    String message= “狼來了”;
       webSocketClient.send(message);

4、最后退出系統時調用close方法即可。

//方式一:使用對象調用webSocketConnect類中寫的closeWebSocket方法。
webSocketConnect.closeWebSocket(request);
//方式二:從session中取出連接對象,直接調用close()方法。
WebSocketClient webSocketClient = (WebSocketClient) session.getAttribute("webSocketClient");

 注:原創作品,歡迎關注,一起學習一起進步!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM