Socket.IO客戶端開(kāi)發(fā)

最近要把一個(gè)即時(shí)通信部署到web端靖榕,原本要用WebSocket标锄,之后在查找WebSocket的時(shí)候看到了Socket.IO這個(gè)東東,要比WebSocket的難度小了很多茁计,還支持多種連接方式料皇,于是果斷換成了Socket.IO。

以下內(nèi)容為個(gè)人理解星压,如有錯(cuò)誤践剂,歡迎指正。


Socket.IO封裝了前端和后端的全部?jī)?nèi)容娜膘,能夠很方便的開(kāi)發(fā)出前后端一體的長(zhǎng)鏈接的網(wǎng)站逊脯。這里我們主要實(shí)現(xiàn)的是Socket.IO的客戶端部分,我們的服務(wù)端使用Java語(yǔ)言進(jìn)行開(kāi)發(fā)竣贪。

使用Socket.IO需要安裝node和npm军洼,在命令行中輸入:

npm install socket.io

因?yàn)槭窃诳蛻舳耸褂肧ocket.IO所以我們需要在使用Scokect.IO的頁(yè)面添加文件引用巩螃,引用socket.io.js文件,這個(gè)文件我們可以選擇官方提供的文件:

<script src="https://cdn.socket.io/socket.io-1.2.1.js"></script>

但是我們建議使用自己服務(wù)器上部署的版本匕争,如果是服務(wù)端使用node.js編寫使用Socket.IO實(shí)現(xiàn)服務(wù)端長(zhǎng)鏈接功能的話避乏,這樣做能夠和服務(wù)端的版本保持一致。使用自己服務(wù)端生成的文件應(yīng)該這樣引用文件:(socket.io.js文件由服務(wù)端自動(dòng)編譯生成)

<script src="/socket.io/socket.io.js"></script>

這里由于我們的服務(wù)器是由Java編寫的汗捡,所以我們引用官方提供的socket.io.js文件淑际。

socket.io.js文件提供了一個(gè)全局的變量io,通過(guò)io我們可以對(duì)socket進(jìn)行操作扇住。


創(chuàng)建一個(gè)socket

創(chuàng)建一個(gè)socket鏈接春缕,我們使用io中的connect方法:

var socket = io.connect('/');
socket.on('connect',function(){
    //連接成功
});
socket.on('disconnect',function(data){
    //連接斷開(kāi)
});

connect函數(shù)可以接受一個(gè)url參數(shù),即要建立鏈接的url艘蹋,url可以是完整的網(wǎng)絡(luò)路徑锄贼,也可以是相對(duì)路徑,也可以不傳女阀,如果是相對(duì)路徑則是相對(duì)于當(dāng)前頁(yè)面主機(jī)的相對(duì)路徑宅荤,如果未傳url則是與當(dāng)前頁(yè)面的路徑建立socket鏈接。

還可以使用一個(gè)更簡(jiǎn)單的方法建立鏈接:

var socket = io('/');
socket.on('connect',function(){
    //連接成功
});
socket.on('disconnect',function(data){
    //連接斷開(kāi)
});

使用io直接創(chuàng)建的這種方式后面參數(shù)還可以傳入對(duì)socket的設(shè)置:

設(shè)置參數(shù)名 設(shè)置參數(shù)類型 默認(rèn)值 設(shè)置說(shuō)明
reconnection bool true 是否重連
reconnectionDelay int 1000 多長(zhǎng)時(shí)間后重新連接(ms)
reconnectionDelayMax int 5000 重新連接的最大等待時(shí)間(ms)
timeout int 20000 連接超時(shí)的時(shí)間(ms)

設(shè)置參數(shù)采用鍵值對(duì)的方式進(jìn)行設(shè)置浸策。
設(shè)置中我們還可以個(gè)傳遞參數(shù)冯键,比如初始化設(shè)置,個(gè)人信息等:

var socket = io.connect('/',{ _query:'sid=123456' });

監(jiān)聽(tīng)socket

上面的創(chuàng)建socket連接的例子中我們已經(jīng)使用了socket的監(jiān)聽(tīng)庸汗。
socket的監(jiān)聽(tīng)采用on方法來(lái)實(shí)現(xiàn)惫确。
on方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是要監(jiān)聽(tīng)的事件蚯舱,第二個(gè)參數(shù)是監(jiān)聽(tīng)到事件后要執(zhí)行的回調(diào)方法改化。
能夠監(jiān)聽(tīng)的事件有:

事件名稱 事件說(shuō)明 事件回調(diào)參數(shù)說(shuō)明
connect 連接成功的事件 無(wú)參數(shù)
connect_failed 連接失敗的事件 參數(shù)Object,里面包含錯(cuò)誤信息
disconnect 斷開(kāi)連接的事件 無(wú)參數(shù)
connecting 正在鏈接的事件 無(wú)參數(shù)
error 連接錯(cuò)誤事件處理
connect_timeout 連接超時(shí)的事件 無(wú)參數(shù)
reconnect 成功重新連接的事件 參數(shù)Number枉昏,重連的次數(shù)
reconnecting 正在重新連接 參數(shù)Number陈肛,重連的次數(shù)
reconnect_failed 重新連接失敗 無(wú)參數(shù)

socket發(fā)送和接受消息

socket提供TCP的消息發(fā)送和接收。
消息發(fā)送使用send接口:

socket.send('hello world!');

消息接收需要監(jiān)聽(tīng)message接口

socket.on('message',function(data){
    //收到消息
    console.log(data);
});

消息的接收和發(fā)送建議寫在connect的事件監(jiān)聽(tīng)器中兄裂。

socket命名空間(房間/分組)

建立鏈接時(shí)我們可以指定將這個(gè)socket放置在某一個(gè)路徑下句旱,這個(gè)路徑下的socket將和其他路徑下的socket互相不干擾。

var socket = io.connect('/chat');

這將會(huì)極大的方便服務(wù)端的廣播(推送)懦窘,服務(wù)端可以在特定的房間內(nèi)發(fā)送廣播(推送)前翎,而在其他房間內(nèi)的socket則不會(huì)接收到該廣播(推送)。

socket中間件

這個(gè)中間件部分將在之后進(jìn)行詳細(xì)講解畅涂,現(xiàn)在只放置一個(gè)身份驗(yàn)證港华,如果沒(méi)有cookies則拋出錯(cuò)誤。

io.use(function(socket, next){
    if (socket.request.headers.cookie) return next();
    next(new Error('Authentication error'));
});

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末立宜,一起剝皮案震驚了整個(gè)濱河市冒萄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌橙数,老刑警劉巖尊流,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異灯帮,居然都是意外死亡崖技,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門钟哥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)迎献,“玉大人,你說(shuō)我怎么就攤上這事腻贰∮趸校” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵播演,是天一觀的道長(zhǎng)冀瓦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)写烤,這世上最難降的妖魔是什么翼闽? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮洲炊,結(jié)果婚禮上肄程,老公的妹妹穿的比我還像新娘。我一直安慰自己选浑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布玄叠。 她就那樣靜靜地躺著古徒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪读恃。 梳的紋絲不亂的頭發(fā)上隧膘,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音寺惫,去河邊找鬼疹吃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛西雀,可吹牛的內(nèi)容都是我干的萨驶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼艇肴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腔呜!你這毒婦竟也來(lái)了叁温?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤核畴,失蹤者是張志新(化名)和其女友劉穎膝但,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谤草,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跟束,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丑孩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀宴。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嚎杨,靈堂內(nèi)的尸體忽然破棺而出花鹅,到底是詐尸還是另有隱情,我是刑警寧澤枫浙,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布刨肃,位于F島的核電站,受9級(jí)特大地震影響箩帚,放射性物質(zhì)發(fā)生泄漏真友。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一紧帕、第九天 我趴在偏房一處隱蔽的房頂上張望盔然。 院中可真熱鬧,春花似錦是嗜、人聲如沸愈案。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)站绪。三九已至,卻和暖如春丽柿,著一層夾襖步出監(jiān)牢的瞬間恢准,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工甫题, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馁筐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓坠非,卻偏偏與公主長(zhǎng)得像敏沉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理赦抖,服務(wù)發(fā)現(xiàn)舱卡,斷路器,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,305評(píng)論 0 6
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評(píng)論 25 707
  • Swift 有許多資源队萤,有收費(fèi)和免費(fèi)的轮锥。http://rshankar.com/ios-training/ htt...
    taoza閱讀 464評(píng)論 0 5
  • 在兩個(gè)人相處中,總是試圖在探尋對(duì)方有多么愛(ài)自己要尔,如果一個(gè)男人有以下幾種表現(xiàn)舍杜,那毫無(wú)疑問(wèn)他一定是愛(ài)你的。 01 隨時(shí)...
    e02b714c57f4閱讀 1,608評(píng)論 3 3