摘要:花了將近一周的時(shí)間終于完成了利用完成網(wǎng)頁(yè)版聊天室這個(gè)小,期間還走過了一段看似彎曲的道路,但是我想其實(shí)也不算是彎路吧,因?yàn)槟阕哌^的路必將留下你的足跡。
花了將近一周的時(shí)間終于完成了利用WebSocket完成網(wǎng)頁(yè)版聊天室這個(gè)小demo,期間還走過了一段“看似彎曲”的道路,但是我想其實(shí)也不算是彎路吧,因?yàn)槟阕哌^的路必將留下你的足跡。這個(gè)小demo看似簡(jiǎn)單,但是這一路走來自己也是花了不少心思才將其完成,今天就和大家一起分享一下。 剛剛接手這個(gè)任務(wù)時(shí),我就想能不能使用Node.js來編寫聊天室的服務(wù)器端,而后才發(fā)現(xiàn)這樣做卻存在“跨域問題”,因?yàn)槟愕那芭_(tái)是部署在Tomcat服務(wù)器上的,所以前臺(tái)和后臺(tái)的數(shù)據(jù)無法進(jìn)行直接的交互,雖然可以間接的進(jìn)行交互但是卻不容易,在此不建議大家采用此種方法,可直接采用Java+html實(shí)現(xiàn)網(wǎng)頁(yè)版聊天室。我將首先介紹客戶端的構(gòu)造而后介紹服務(wù)器端:客戶端
【1】 頁(yè)面的編寫(使用HTML編寫)
昵稱: 內(nèi)容: 歡迎光臨聊天室
說明:
在此我首先放置了一個(gè)ID 名為message的div用來顯示存放的消息
然后我放置了兩個(gè)input標(biāo)簽:一個(gè)存放昵稱,另一個(gè)存放用戶要發(fā)出去的昵稱
最后設(shè)置兩個(gè)按鈕用來發(fā)送消息和退出聊天
【2】頁(yè)面的腳本編寫
說明:以上幾個(gè)方法例如onclose,onmessage均是websocket自帶的方法,大家只需要在websocket文檔上查看各個(gè)函數(shù)是什么功能。
服務(wù)器端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; //該注解用來指定一個(gè)URI,客戶端可以通過這個(gè)URI來連接到WebSocket。類似Servlet的注解mapping。無需在web.xml中配置。 @ServerEndpoint("/websocket") public class MyWebSocket { // 靜態(tài)變量,用來記錄當(dāng)前在線連接數(shù)。應(yīng)該把它設(shè)計(jì)成線程安全的。 private static int onlineCount = 0; // concurrent包的線程安全Set,用來存放每個(gè)客戶端對(duì)應(yīng)的MyWebSocket對(duì)象。若要實(shí)現(xiàn)服務(wù)端與單一客戶端通信的話,可以使用Map來存放,其中Key可以為用戶標(biāo)識(shí) private static CopyOnWriteArraySetwebSocketSet = new CopyOnWriteArraySet (); // 與某個(gè)客戶端的連接會(huì)話,需要通過它來給客戶端發(fā)送數(shù)據(jù) private Session session; @OnOpen public void onOpen(Session session) { this.session = session; webSocketSet.add(this); // 加入set中 addOnlineCount(); // 在線數(shù)加1 System.out.println("有新連接加入!當(dāng)前在線人數(shù)為" + getOnlineCount()); } /** * 連接關(guān)閉調(diào)用的方法 */ @OnClose public void onClose() { webSocketSet.remove(this); // 從set中刪除 subOnlineCount(); // 在線數(shù)減1 System.out.println("有一連接關(guān)閉!當(dāng)前在線人數(shù)為" + getOnlineCount()); } @OnMessage public void onMessage(String message, Session session) { System.out.println("來自客戶端的消息:" + message); // 群發(fā)消息 for (MyWebSocket item : webSocketSet) { try { item.sendMessage(message); } catch (IOException e) { e.printStackTrace(); continue; } } } @OnError public void onError(Session session, Throwable error) { System.out.println("發(fā)生錯(cuò)誤"); error.printStackTrace(); } 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() { MyWebSocket.onlineCount++; } public static synchronized void subOnlineCount() { MyWebSocket.onlineCount--; } }
程序中我對(duì)重要的部門都標(biāo)記了注釋,相信大家只要稍微看過就可以看懂,在此我就不一一贅述了,大家如果在運(yùn)行過程中有問題的可以在文章下方進(jìn)行評(píng)論,我們可以一起討論一下。最后我附上整個(gè)項(xiàng)目文件的位置以供小伙伴們下載運(yùn)行。
百度網(wǎng)盤下載地址:鏈接:http://pan.baidu.com/s/1pLQbeDP 密碼:t2vp
該鏈接可能已經(jīng)失效,有需要的朋友可以發(fā)送郵件至[email protected]。感謝您的關(guān)注。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67627.html
摘要:花了將近一周的時(shí)間終于完成了利用完成網(wǎng)頁(yè)版聊天室這個(gè)小,期間還走過了一段看似彎曲的道路,但是我想其實(shí)也不算是彎路吧,因?yàn)槟阕哌^的路必將留下你的足跡。 花了將近一周的時(shí)間終于完成了利用WebSocket完成網(wǎng)頁(yè)版聊天室這個(gè)小demo,期間還走過了一段看似彎曲的道路,但是我想其實(shí)也不算是彎路吧,因?yàn)槟阕哌^的路必將留下你的足跡。這個(gè)小demo看似簡(jiǎn)單,但是這一路走來自己也是花了不少心思才將其...
摘要:用偽代碼來模擬下長(zhǎng)輪詢的過程前端利用下面函數(shù)進(jìn)行請(qǐng)求后端代碼做如下更改利用隨機(jī)數(shù)的大小來模擬是否有新數(shù)據(jù)有新數(shù)據(jù)來了長(zhǎng)輪詢的確減少了請(qǐng)求的次數(shù),但是它也有著很大的問題,那就是耗費(fèi)服務(wù)器的資源。 寫在前面 最近由于利用node重構(gòu)某個(gè)項(xiàng)目,項(xiàng)目中有一個(gè)實(shí)時(shí)聊天的功能,于是就研究了一下聊天室,在線demo|源碼,歡迎大家反饋。這個(gè)聊天室的主要利用到了socket.io和express。這個(gè)...
摘要:本文對(duì)過去和現(xiàn)在流行的實(shí)時(shí)推送技術(shù)進(jìn)行了比較與總結(jié)。以上我們介紹了三種實(shí)時(shí)推送技術(shù),然而各自的缺點(diǎn)很明顯,使用起來并不理想,接下來我們著重介紹另一種技術(shù)它是比較理想的雙向通信技術(shù)。 前言 隨著 Web 的發(fā)展,用戶對(duì)于 Web 的實(shí)時(shí)推送要求也越來越高 ,比如,工業(yè)運(yùn)行監(jiān)控、Web 在線通訊、即時(shí)報(bào)價(jià)系統(tǒng)、在線游戲等,都需要將后臺(tái)發(fā)生的變化主動(dòng)地、實(shí)時(shí)地傳送到瀏覽器端,而不需要用戶手動(dòng)...
閱讀 2893·2023-04-26 02:49
閱讀 3460·2021-11-25 09:43
閱讀 3435·2021-10-09 09:43
閱讀 3018·2021-09-28 09:44
閱讀 2461·2021-09-22 15:29
閱讀 4533·2021-09-14 18:02
閱讀 2791·2021-09-03 10:48
閱讀 3438·2019-08-30 12:47