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替代