用java WebSocket做一個聊天室。本站提示廣大學習愛好者:(用java WebSocket做一個聊天室)文章只能為提供參考,不一定能成為您想要的結果。以下是用java WebSocket做一個聊天室正文
比來一個項目中,須要用到Java的websocket新特征,因而就學了一下,感到這技巧還挺好玩的,剎時曉得網頁下面的那些在線客服是怎樣做的了。
先看圖:
完成了多客戶機停止及時通信。
上面看代碼項目構造圖:很簡略,就1個類,1個頁面
然後看詳細代碼
先看後端代碼
package com.main; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; /** * @ServerEndpoint 注解是一個類條理的注解,它的功效重要是將今朝的類界說成一個websocket辦事器端, * 注解的值將被用於監聽用戶銜接的終端拜訪URL地址,客戶端可以經由過程這個URL來銜接到WebSocket辦事器端 */ @ServerEndpoint("/websocket") public class H5ServletServerSocket { // 靜態變量,用來記載以後在線銜接數。應當把它設計成線程平安的。 private static int onlineCount = 0; // concurrent包的線程平安Set,用來寄存每一個客戶端對應的MyWebSocket對象。若要完成辦事端與單一客戶端通訊的話,可使用Map來寄存,個中Key可認為用戶標識 private static CopyOnWriteArraySet<H5ServletServerSocket> webSocketSet = new CopyOnWriteArraySet<H5ServletServerSocket>(); // 與某個客戶真個銜接會話,須要經由過程它來給客戶端發送數據 private Session session; /** * 銜接樹立勝利挪用的辦法 * * @param session * 可選的參數。session為與某個客戶真個銜接會話,須要經由過程它來給客戶端發送數據 */ @OnOpen public void onOpen(Session session) { this.session = session; webSocketSet.add(this); // 參加set中 addOnlineCount(); // 在線數加1 System.out.println("有新銜接參加!以後在耳目數為" + getOnlineCount()); } /** * 銜接封閉挪用的辦法 */ @OnClose public void onClose() { webSocketSet.remove(this); // 從set中刪除 subOnlineCount(); // 在線數減1 System.out.println("有連續接封閉!以後在耳目數為" + getOnlineCount()); } /** * 收到客戶端新聞後挪用的辦法 * * @param message * 客戶端發送過去的新聞 * @param session * 可選的參數 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("來自客戶真個新聞:" + message); // 群發新聞 for (H5ServletServerSocket item : webSocketSet) { try { item.sendMessage(message); } catch (IOException e) { e.printStackTrace(); continue; } } } /** * 產生毛病時挪用 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { System.out.println("產生毛病"); error.printStackTrace(); } /** * 這個辦法與下面幾個辦法紛歧樣。沒有效注解,是依據本身須要添加的辦法。 * * @param message * @throws IOException */ public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); // this.session.getAsyncRemote().sendText(message); } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { H5ServletServerSocket.onlineCount++; } public static synchronized void subOnlineCount() { H5ServletServerSocket.onlineCount--; } }
接上去是前端頁面代碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML> <html> <head> <base href="<%=basePath%>"> <title>My WebSocket</title> </head> <body> 迎接進入聊天室 <div id="message" >【狀況】</div> <br /> 昵稱 <input id="username" type="text" required="required"/> <br> 內容 <input id="text" type="text" /> <br /> <button onclick="send()">發送</button> <button onclick="closeWebSocket()">封閉</button> </body> <script type="text/javascript"> var websocket = null; //斷定以後閱讀器能否支撐WebSocket if ('WebSocket' in window) { websocket = new WebSocket("ws://10.1.1.106:8080/Socket/websocket"); } else { alert('不支撐WebSocket!') } //銜接產生毛病的回調辦法 websocket.onerror = function() { setMessageInnerHTML("error"); }; //銜接勝利樹立的回調辦法 websocket.onopen = function(event) { setMessageInnerHTML("聊天室開啟"); } //吸收到新聞的回調辦法 websocket.onmessage = function() { setMessageInnerHTML(event.data); } //銜接封閉的回調辦法 websocket.onclose = function() { setMessageInnerHTML("聊天室封閉"); } //監聽窗口封閉事宜,當窗口封閉時,自動去封閉websocket銜接,避免銜接還沒斷開就封閉窗口,server端會拋異常。 window.onbeforeunload = function() { websocket.close(); } //將新聞顯示在網頁上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML + '<br/>'; } //封閉銜接 function closeWebSocket() { websocket.close(); } //發送新聞 function send() { var username = document.getElementById('username').value; var message = document.getElementById('text').value; var msg = "【" + username + "】談話:" + message websocket.send(msg); } </script> </html>
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。