socket系列(二)——Javaee實現實時通訊

  • 2019 年 10 月 30 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/luo4105/article/details/72692184

實現

java自帶javaee-api7.0實現

環境要求

Tomcat7.0以上支援(最好tomcat8.0以上)

Ie7,8,9不支援,可以有sockeJS代替

Jar包:javaee-api-7.0.jar

項目結構

Java程式碼

import java.io.IOException;  import java.util.concurrent.CopyOnWriteArraySet;    import javax.websocket.OnClose;  import javax.websocket.OnError;  import javax.websocket.OnMessage;  import javax.websocket.OnOpen;  import javax.websocket.Session;  import javax.websocket.server.ServerEndpoint;    @ServerEndpoint(value = "/websocket")  public classPushSocket {        // 連接人數      private static int count;        private staticCopyOnWriteArraySet<PushSocket> set = new CopyOnWriteArraySet<>();        // 服務端與客戶端的通話      private Session session;        @OnOpen      public void onOpen(Session session) {         this.session = session;         set.add(this);         addOnlineCount();         System.out.println("伺服器在線人數:" + getOnlineCount());      }        @OnClose      public void onClose(Session session) {         set.remove(this);         subOnlineCount();         System.out.println("伺服器在線人數:" + getOnlineCount());      }        @OnMessage      public void onMessage(String message, Session session) {         System.out.println("來自客戶端的消息:" + message);         // 群發消息         for (PushSocket socket : set) {             try {                System.out.println(socket.hashCode());                socket.sendMsg(message);             }catch(IOException e) {                e.printStackTrace();                continue;             }         }      }        @OnError      public void onError(Session session, Throwable error) {         System.out.println("發生錯誤");         error.printStackTrace();      }        /**       * 某個連接發送消息       * @param msg       */      public void sendMsg(String msg) throws IOException {         this.session.getBasicRemote().sendText(msg);      }        public static int getOnlineCount() {         return count;      }        public static void addOnlineCount() {         count++;      }        public static void subOnlineCount() {         count--;      }  }

Jsp程式碼

<%@ page language="java"contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%>  <!DOCTYPE html>  <html>      <head>         <meta charset="UTF-8">         <title>socket</title>         <script type="text/javascript" src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>      </head>      <body>         welcome<br />         <input id="text" type="text"/>         <button οnclick="sendMsg()">sendMsg</button>         <hr/>         <button οnclick="closeWebSocket()">close WebSocketconnection</button>         <hr/>         <div id="message"></div>      </body>        <script type="text/javascript">         var websocket = null;         //判斷瀏覽器是否支援websocket         if('WebSocket' in window) {             websocket= newWebSocket("ws://localhost:8080/study_push/websocket");         }else{             $("#message").html("該瀏覽器不支援實時通訊功能");         }           websocket.onopen= function() {             console.log("websocket連接成功");         }           websocket.onclose= function() {             console.log("websocket連接關閉");         }           websocket.onmessage= function(event) {             console.log("接收消息");             console.log(event);             printMsg(event.data);         }           //列印消息         function printMsg(msg) {             $("#message").append(msg+ "<br/>");         }           function sendMsg() {             var msg = $("#text").val();             websocket.send(msg);         }           function closeWebSocket(){             websocket.close();         }      </script>  </html>

Web.xml配置

<?xml version="1.0"encoding="UTF-8"?>  <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xmlns="http://java.sun.com/xml/ns/javaee"      xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"      id="WebApp_ID" version="3.0">      <display-name>study_push</display-name>      <welcome-file-list>         <welcome-file>index.jsp</welcome-file>      </welcome-file-list>  </web-app>

運行

打開」 http://localhost:8080/study_push/IMpage.jsp」,實現情況

總結

Javaee-api對於websocket的處理十分輕便,好用便捷。

Java程式碼:

"@ServerEndpoint(value ="/websocket")":tomcat就會默認把該標籤的類當作一個websocket,value就是連接地址。

"@OnOpen":當有新的連接時執行方法,這裡執行的是給session賦值,添加該連接對象,增加連接數量,列印連接資訊。

"@OnClose":當有連接關閉時執行方法,這裡執行的是移除連接對象和列印資訊操作。

"@OnMessage":當有新消息傳後台時執行方法,這裡執行的是給所有連接對象發送該請求。

"@OnError":當有連接錯誤時執行方法。

每當有新的客戶端連接時,都會創建一個新的PushSocket對象,所以這裡用CopyOnWriteArraySet<PushSocket>set來存放所有的連接對象。

Js程式碼:

"websocket = new WebSocket()":連接伺服器websocket,參數就是伺服器websocket地址

"websocket.onopen":連接後執行。

"websocket.onclose":關閉執行。

"websocket.onmessage":伺服器發送消息。

ie7、8、9不支援websocket,可以使用socketJS替代