Spring Boot WebSocket

1、在pom.xml文件中添加依賴

<dependency>

? ? <groupId>org.springframework.boot</groupId>

? ? <artifactId>spring-boot-starter-websocket</artifactId>

</dependency>

2圈匆、WebSocketConfig

@Configuration

public class WebSocketConfig {

@Bean

? ? public ServerEndpointExporterserverEndpointExporter(){

return new ServerEndpointExporter();

? ? }

}

3馒过、WebSocketServer

@ServerEndpoint("/websocket")

@Component

public class WebSocketServer {

//靜態(tài)變量腹忽,用來記錄當(dāng)前在線連接數(shù)。應(yīng)該把它設(shè)計成線程安全的嘹锁。

? ? private static int onlineCount =0;

? ? //concurrent包的線程安全Set着裹,用來存放每個客戶端對應(yīng)的MyWebSocket對象。

? ? private static CopyOnWriteArraySetwebSocketSet =new CopyOnWriteArraySet();

? ? //與某個客戶端的連接會話摔竿,需要通過它來給客戶端發(fā)送數(shù)據(jù)

? ? private Sessionsession;

? ? /**

* 連接建立成功調(diào)用的方法

*/

? ? @OnOpen

? ? public void onOpen(Session session) {

this.session = session;

? ? ? ? webSocketSet.add(this);? ? //加入set中

? ? ? ? addOnlineCount();? ? ? ? ? //在線數(shù)加1

? ? ? ? System.out.println("有新窗口開始監(jiān)聽,當(dāng)前在線人數(shù)為" +getOnlineCount());

? ? ? ? try {

sendMessage("連接成功");

? ? ? ? }catch (IOException e) {

System.out.println("WebSocket IO異常");

? ? ? ? }

}

/**

* 連接關(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ā)送過來的消息

*/

? ? @OnMessage

? ? public void onMessage(String message, Session session) {

System.out.println("收到客戶端的信息:" + message);

? ? ? ? //群發(fā)消息

? ? ? ? for (WebSocketServer item :webSocketSet) {

try {

item.sendMessage(message);

? ? ? ? ? ? }catch (IOException e) {

e.printStackTrace();

? ? ? ? ? ? }

}

}

/**

? ? * @param session

? ? * @param error

? ? */

? ? @OnError

? ? public void onError(Session session, Throwable error) {

System.out.println("發(fā)生錯誤");

? ? ? ? error.printStackTrace();

? ? }

/**

* 實現(xiàn)服務(wù)器主動推送

*/

? ? public void sendMessage(String message)throws IOException {

this.session.getBasicRemote().sendText(message);

? ? }

/**

* 群發(fā)自定義消息

*/

? ? public static void sendInfo(String message)throws IOException {

System.out.println("推送消息內(nèi)容:" + message);

? ? ? ? for (WebSocketServer item :webSocketSet) {

try {

item.sendMessage(message);

? ? ? ? ? ? }catch (IOException e) {

continue;

? ? ? ? ? ? }

}

}

4袁翁、WebSocketController

@RestController

public class WebSocketController {

@RequestMapping("/socket")

public StringopenTencent(){

? ? ? ? return "tencent";

? ? }

/**

* 推送數(shù)據(jù)

? ? * @param say

? ? * @return

? ? */

? ? @RequestMapping("/socket/push")

public StringpushMsg(@RequestParam("say") String say) {

try {

WebSocketServer.sendInfo("服務(wù)器推送消息"+say);

? ? ? ? }catch (IOException e) {

e.printStackTrace();

? ? ? ? }

return "tencent";

? ? }

}

5粱胜、index

<!DOCTYPE html>

<html lang="en">

? ? <meta charset="UTF-8">

? ? <title>WebSocket頁面

<div style="margin-left:400px;width:500px;height:120px;background-color:wheat">

? ? <h2>請輸入想說的話:

? ? <input type="text" id="say" name="say">

? ? <input type="button" id="sendSay" name="sendSay" value="發(fā)送">

<div style="margin-left:400px;">

? ? <h2>對話框

? ? <textarea id="message" cols="150px" rows="200px" disabled style="width:500px;height:500px">

? ? var socket;

? ? var say = document.getElementById("say");

? ? var sendSay = document.getElementById("sendSay");

? ? var message= document.getElementById("message");

? ? if (typeof(WebSocket) =="undefined") {

console.log("您的瀏覽器不支持WebSocket");

? ? }else {

console.log("您的瀏覽器支持WebSocket");

? ? ? ? //實現(xiàn)化WebSocket對象焙压,指定要連接的服務(wù)器地址與端口建立連接

? ? ? ? socket =new WebSocket("ws://localhost:8080/websocket");

? ? ? ? //打開事件

? ? ? ? socket.onopen =function () {

console.log("Socket已打開");

? ? ? ? ? ? // socket.send("這是來自客戶端的消息:" + new Date());

? ? ? ? };

? ? ? ? sendSay.onclick =function sendSay(){

socket.send("這是來自客戶端的消息:" + say.value)

};

? ? ? ? //獲得消息事件

? ? ? ? socket.onmessage =function (msg) {

console.log(msg.data);

? ? ? ? ? ? // alert(msg.data);

? ? ? ? ? ? var messageInfo = message.value;

? ? ? ? ? ? messageInfo = messageInfo +" \n " + msg.data;

? ? ? ? ? ? message.value = messageInfo;

? ? ? ? };

? ? ? ? //關(guān)閉事件

? ? ? ? socket.onclose =function () {

console.log("Socket已關(guān)閉");

? ? ? ? };

? ? ? ? //發(fā)生了錯誤事件

? ? ? ? socket.onerror =function () {

alert("Socket發(fā)生了錯誤");

? ? ? ? }

}

</html>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冗恨,一起剝皮案震驚了整個濱河市味赃,隨后出現(xiàn)的幾起案子心俗,更是在濱河造成了極大的恐慌蓉驹,老刑警劉巖揪利,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疟位,死亡現(xiàn)場離奇詭異,居然都是意外死亡绍撞,警方通過查閱死者的電腦和手機得院,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門祥绞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜕径,你說我怎么就攤上這事兜喻。” “怎么了虹统?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵车荔,是天一觀的道長戚扳。 經(jīng)常有香客問我帽借,道長,這世上最難降的妖魔是什么砍艾? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任脆荷,我火速辦了婚禮懊悯,結(jié)果婚禮上炭分,老公的妹妹穿的比我還像新娘剑肯。我一直安慰自己,他們只是感情好呀忧,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布寂祥。 她就那樣靜靜地躺著丸凭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铛碑。 梳的紋絲不亂的頭發(fā)上虽界,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天莉御,我揣著相機與錄音,去河邊找鬼礁叔。 笑死,一個胖子當(dāng)著我的面吹牛煮岁,可吹牛的內(nèi)容都是我干的涣易。 我是一名探鬼主播新症,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戳护!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梗肝,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤巫击,失蹤者是張志新(化名)和其女友劉穎精续,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體重付,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡确垫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年删掀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纤子。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡控硼,死狀恐怖艾少,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤抄瓦,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布潮瓶,位于F島的核電站,受9級特大地震影響钙姊,放射性物質(zhì)發(fā)生泄漏毯辅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一煞额、第九天 我趴在偏房一處隱蔽的房頂上張望思恐。 院中可真熱鬧沾谜,春花似錦、人聲如沸胀莹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽描焰。三九已至媳否,卻和暖如春荆秦,著一層夾襖步出監(jiān)牢的瞬間篱竭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工步绸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掺逼,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓瓤介,卻偏偏與公主長得像吕喘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惑朦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-WebSo...
    敢夢敢當(dāng)閱讀 8,920評論 0 50
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理兽泄,服務(wù)發(fā)現(xiàn),斷路器漾月,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • 【1】http協(xié)議介紹 1)介紹:http協(xié)議是請求/響應(yīng)范式的病梢,每個http 響應(yīng)都對應(yīng)一個 http 請求,h...
    每一天為明天168閱讀 1,364評論 0 1
  • 近半年堅持每天喂流浪貓梁肿,樓下的貓仔漸漸知道在52號樓下是有糧可食的蜓陌,從小小貓一點點長大長肥了,貓仔們也算知恩吩蔑,現(xiàn)...
    俞晴天閱讀 299評論 0 0
  • 世界上多數(shù)人都是努力的钮热,而真正成功的只是少數(shù)人。那么努力為什么不會帶來成功烛芬,因為有目標(biāo)卻不敢行動隧期,還因為根本沒有目...
    千面英雄俠閱讀 1,415評論 0 1