日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

基于java實(shí)現(xiàn)websocket代碼示例

瀏覽:17日期:2022-08-20 11:03:42

最近了解了下websocket和socket這個(gè)東西,說(shuō)不得不來(lái)說(shuō)下為何要使用 WebSocket ,和為何不用http。

為何需要WebSocket ?

HTTP 協(xié)議是一種無(wú)狀態(tài)的、無(wú)連接的、單向的應(yīng)用層協(xié)議。它采用了請(qǐng)求/響應(yīng)模型。通信請(qǐng)求只能由客戶端發(fā)起,服務(wù)端對(duì)請(qǐng)求做出應(yīng)答處理。

這種通信模型有一個(gè)弊端:HTTP 協(xié)議無(wú)法實(shí)現(xiàn)服務(wù)器主動(dòng)向客戶端發(fā)起消息。

這種單向請(qǐng)求的特點(diǎn),注定了如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。大多數(shù) Web 應(yīng)用程序?qū)⑼ㄟ^(guò)頻繁的異步JavaScript和XML(AJAX)請(qǐng)求實(shí)現(xiàn)長(zhǎng)輪詢。輪詢的效率低,非常浪費(fèi)資源(因?yàn)楸仨毑煌_B接,或者 HTTP 連接始終打開(kāi))。

因此,工程師們一直在思考,有沒(méi)有更好的方法。WebSocket 就是這樣發(fā)明的。WebSocket 連接允許客戶端和服務(wù)器之間進(jìn)行全雙工通信,以便任一方都可以通過(guò)建立的連接將數(shù)據(jù)推送到另一端。WebSocket 只需要建立一次連接,就可以一直保持連接狀態(tài)。這相比于輪詢方式的不停建立連接顯然效率要大大提高。

下面來(lái)一個(gè)例子,實(shí)現(xiàn)web客戶端和服務(wù)器端的連續(xù)通訊。

客戶端頁(yè)面index.html

<!DOCTYPE html><html><head> <title>Java后端WebSocket的Tomcat實(shí)現(xiàn)</title></head><body> Welcome<br/><input type='text'/> <button onclick='send()'>發(fā)送消息</button> <hr/> <button onclick='closeWebSocket()'>關(guān)閉WebSocket連接</button> <hr/> <div id='message'></div></body> <script type='text/javascript'> var websocket = null; //判斷當(dāng)前瀏覽器是否支持WebSocket if (’WebSocket’ in window) { websocket = new WebSocket('ws://localhost:8080/Testwebsocket/websocket'); } else { alert(’當(dāng)前瀏覽器 Not support websocket’) } //連接發(fā)生錯(cuò)誤的回調(diào)方法 websocket.onerror = function () { setMessageInnerHTML('WebSocket連接發(fā)生錯(cuò)誤'); }; //連接成功建立的回調(diào)方法 websocket.onopen = function () { setMessageInnerHTML('WebSocket連接成功'); } //接收到消息的回調(diào)方法 websocket.onmessage = function (event) { setMessageInnerHTML(event.data); } //連接關(guān)閉的回調(diào)方法 websocket.onclose = function () { setMessageInnerHTML('WebSocket連接關(guān)閉'); } //監(jiān)聽(tīng)窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒(méi)斷開(kāi)就關(guān)閉窗口,server端會(huì)拋異常。 window.onbeforeunload = function () { closeWebSocket(); } //將消息顯示在網(wǎng)頁(yè)上 function setMessageInnerHTML(innerHTML) { document.getElementById(’message’).innerHTML += innerHTML + ’<br/>’; } //關(guān)閉WebSocket連接 function closeWebSocket() { websocket.close(); } //發(fā)送消息 function send() { var message = document.getElementById(’text’).value; websocket.send(message); }</script></html>

服務(wù)器端:服務(wù)器端的很簡(jiǎn)單。

1.創(chuàng)建一個(gè)web 的maven項(xiàng)目

2.引入一個(gè)包

<!-- websocket --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency>

3.創(chuàng)建一個(gè)類。

package com.sun.web.handler; import java.io.IOException;import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.*;import javax.websocket.server.ServerEndpoint; /** * @ServerEndpoint 注解是一個(gè)類層次的注解,它的功能主要是將目前的類定義成一個(gè)websocket服務(wù)器端, * 注解的值將被用于監(jiān)聽(tīng)用戶連接的終端訪問(wèn)URL地址,客戶端可以通過(guò)這個(gè)URL來(lái)連接到WebSocket服務(wù)器端 */@ServerEndpoint('/websocket')public class WebSocketTest { //靜態(tài)變量,用來(lái)記錄當(dāng)前在線連接數(shù)。應(yīng)該把它設(shè)計(jì)成線程安全的。 private static int onlineCount = 0; //concurrent包的線程安全Set,用來(lái)存放每個(gè)客戶端對(duì)應(yīng)的MyWebSocket對(duì)象。若要實(shí)現(xiàn)服務(wù)端與單一客戶端通信的話,可以使用Map來(lái)存放,其中Key可以為用戶標(biāo)識(shí) private static CopyOnWriteArraySet<WebSocketTest> webSocketSet = new CopyOnWriteArraySet<WebSocketTest>(); //與某個(gè)客戶端的連接會(huì)話,需要通過(guò)它來(lái)給客戶端發(fā)送數(shù)據(jù) private Session session; /** * 連接建立成功調(diào)用的方法 * @param session 可選的參數(shù)。session為與某個(gè)客戶端的連接會(huì)話,需要通過(guò)它來(lái)給客戶端發(fā)送數(shù)據(jù) */ @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()); } /** * 收到客戶端消息后調(diào)用的方法 * @param message 客戶端發(fā)送過(guò)來(lái)的消息 * @param session 可選的參數(shù) */ @OnMessage public void onMessage(String message, Session session) { System.out.println('來(lái)自客戶端的消息:' + message); //群發(fā)消息 for(WebSocketTest item: webSocketSet){ try {item.sendMessage(message); } catch (IOException e) {e.printStackTrace();continue; } } } /** * 發(fā)生錯(cuò)誤時(shí)調(diào)用 * @param session * @param error */ @OnError public void onError(Session session, Throwable error){ System.out.println('發(fā)生錯(cuò)誤'); error.printStackTrace(); } /** * 這個(gè)方法與上面幾個(gè)方法不一樣。沒(méi)有用注解,是根據(jù)自己需要添加的方法。 * @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() { WebSocketTest.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketTest.onlineCount--; }}

4.以上三步就OK了,然后就是用tomcat運(yùn)行就行了。

效果如圖:

基于java實(shí)現(xiàn)websocket代碼示例

后期整合了springboot + websocket,并且實(shí)現(xiàn)了定時(shí)推送給前,還可以實(shí)現(xiàn)推送給某個(gè)人,不過(guò)需要參數(shù).

地址 :

https://github.com/sun2955/spring-test-study.git

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品探花在线观看| 精品免费在线| japanese国产精品| 久久天堂精品| 欧美精选一区二区三区| 日韩一级精品| 亚洲日产av中文字幕| 日韩中文字幕一区二区高清99| 日本欧美久久久久免费播放网| 国产毛片精品| 精品伊人久久久| 精精国产xxxx视频在线野外| 黄色成人91| 久久国产免费看| 老牛影视精品| 在线观看一区| 精品视频99| 香蕉精品999视频一区二区| 丝袜亚洲另类欧美| 精品视频在线观看网站| 欧美不卡高清| 国产精品一线| 欧美1区2区3区| 免费一级欧美片在线观看网站| 亚洲成a人片| 伊人精品在线| 久久国产精品免费一区二区三区| 高清在线一区| 亚洲精品九九| 久久久五月天| 久久中文精品| 日韩av一二三| 久久不射中文字幕| 九色porny丨国产首页在线| 日韩av一区二区三区| 亚洲高清不卡| 91亚洲人成网污www| 欧美日本三区| 男人的天堂亚洲一区| 欧美片第1页| 国产欧美日韩精品一区二区免费 | 国产亚洲电影| 久久亚洲视频| 久久国产直播| 超碰99在线| 久久不见久久见国语| 综合色一区二区| 国产一级一区二区| 国产综合精品一区| 日韩精品麻豆| 国产麻豆久久| 亚洲综合在线电影| 黄在线观看免费网站ktv| 日本欧美在线| 国产精品亚洲欧美一级在线| 欧美日韩一区二区三区四区在线观看 | 国产精品二区不卡| 欧美永久精品| 亚洲精品韩国| 黄色日韩在线| 国产一区白浆| 午夜在线观看免费一区| 黄色亚洲大片免费在线观看| 国产主播一区| 国产欧美日韩影院| 亚洲小说欧美另类婷婷| 国产精品v一区二区三区| 色偷偷色偷偷色偷偷在线视频| 99久久精品费精品国产| 免费欧美在线视频| 国产精久久久| 国产婷婷精品| 精品视频久久| 视频一区视频二区在线观看| 精品一区二区三区在线观看视频| 不卡av一区二区| 国产一区二区三区不卡av| 日韩精品网站| 久久99久久人婷婷精品综合| 国产一区二区三区亚洲综合| 久久电影tv| 欧美日韩视频免费观看| 欧美片第1页| 视频一区欧美精品| 久久av资源| 不卡中文字幕| 国产精品一区免费在线| 日本美女一区| 日韩毛片网站| 日韩欧美二区| 日韩精品一区二区三区av| 91亚洲国产| 欧美日韩免费观看一区=区三区| 综合视频一区| 久久国产欧美| 国产精品最新| 激情久久五月| 欧美精品不卡| 视频在线观看一区| 国产精品久久久久久久久久10秀| 午夜久久一区| 国产拍在线视频| 国产亚洲精品美女久久久久久久久久| 秋霞影视一区二区三区| 国产精品欧美大片| 在线精品一区| 免费不卡中文字幕在线| 91亚洲精品视频在线观看| 欧美日韩国产欧| 日韩久久一区二区三区| 国产精品天天看天天狠| 亚洲精品极品| 丝袜美腿一区二区三区| 久久一区二区三区电影| 都市激情国产精品| 欧美日本一区| 国产亚洲电影| 91亚洲无吗| 欧美亚洲一级| 少妇精品久久久一区二区三区| 午夜国产精品视频免费体验区| 日韩精品一区二区三区免费观看| 亚洲综合色婷婷在线观看| 午夜久久一区| 亚洲美洲欧洲综合国产一区| 久久久久国产| 91精品观看| 亚洲综合电影一区二区三区| 欧美在线亚洲| 视频一区二区欧美| 亚洲资源av| 日韩国产欧美视频| 欧美一级一区| 国产精品久久久久久av公交车| 欧美视频二区| 精品国产精品国产偷麻豆| 高清在线一区| 亚洲天堂av影院| 天堂资源在线亚洲| 性色av一区二区怡红| 亚洲精品一区二区在线看| 好吊日精品视频| 亚洲图片久久| 日本成人在线一区| 国际精品欧美精品| 亚洲精品一级二级| 亚洲综合另类| 国产欧美一级| 欧美gv在线| 深夜日韩欧美| 黄色精品视频| 丝袜美腿高跟呻吟高潮一区| 亚洲精品系列| 精品久久91| 久久亚洲欧洲| 国产精品v日韩精品v欧美精品网站| 国产aa精品| 国产亚洲精品久久久久婷婷瑜伽| 色综合视频一区二区三区日韩 | 国产一区二区三区四区二区| 国产一区二区亚洲| 伊人影院久久| 久久wwww| 免费成人在线视频观看| 精品资源在线| 首页亚洲欧美制服丝腿| 国产精品一二| 国产一区成人| 国产精品毛片一区二区在线看| 亚洲香蕉网站| 精品72久久久久中文字幕| 午夜欧美视频| 国产在线观看www| 欧美日韩亚洲国产精品| 日韩视频在线一区二区三区 | 欧美日本一区| 99成人在线| 国产成年精品| 国产探花在线精品一区二区| 久久青草久久| 精品一区二区三区免费看| 噜噜噜躁狠狠躁狠狠精品视频| 三上悠亚国产精品一区二区三区 | 在线午夜精品| 欧美日韩精品一区二区视频| 久久精品亚洲一区二区| 男人的天堂久久精品| 一本一道久久a久久精品蜜桃| 国产精品sss在线观看av| 亚洲精品动态| 另类亚洲自拍| 亚洲综合日韩| 亚洲一区免费| 欧美综合二区| 亚洲一区二区三区无吗| 日韩一级精品| 亚洲一区二区三区在线免费| 亚洲播播91| 国产专区一区| 亚洲一区二区网站|