關於websocket製做聊天室的的一些總結

websocket的總結

在一個聊天室系統中,經常使用websocket做爲通訊的主要方式。
參考地址:https://www.jianshu.com/p/00e...node


關於本身的見解:
websocket協議是一種新的tcp協議,與經常使用的http協議不一樣的地方在於,不管是客戶端仍是服務端,都能進行自由通訊,雙方都比較靈活,不會有侷限性。
文中所提到的socket.io包是封裝有websocket協議的包,他包含很多服務端處理的代碼,兼容性強,主要服務於實時通訊。
開始以前,須要構建網絡服務,主要用到的包就是socket.io和http服務的包,因爲是node的後臺,因此須要設置一個進行監聽的端口,方便在瀏覽器中調試。web

/*app.js*/
/*構建http服務*/
var app = require('http').createServer()
/*引入socket.io*/
var io = require('socket.io')(app);
/*定義監聽端口,能夠自定義,端口不要被佔用*/
var PORT = 8081;
/*監聽端口*/
app.listen(PORT);

後臺系統爲nodejs搭載瀏覽器

主要應用在聊天系統中socket.io中的方法:websocket

  1. socket.emit()
  2. socket.on()
  3. io.sockets.emit()

對於第一種,socket.emit()方法主要是在客戶端和服務端之間進行信息請求,例如客戶端向服務端發送請求或者服務端向客戶端進行反饋請求,這兩種狀況下主要用到的方法。
需求場景:客戶端上,用戶輸入帳號密碼進行登錄,服務端怎麼識別?
(1)首先是客戶端獲取到用戶在輸入框中的信息,而後對服務端進行發送信息。網絡

socket.emit('login',{username:uname})

代碼塊中,login爲自定義方法名,其後是傳送的數據,項目中只考慮到用戶名的輸入,因此保存爲一個對象發送給服務端,這裏用到了socket.emit()方法,是客戶端----->服務端的請求
(2)服務端對客戶端所發送的請求進行處理app

socket.on('login',function(data){
    /*登錄驗證等操做*/
})

在這裏,經過socket.on來接受客戶端所傳遞的數據,爲相同方法名,其後跟的function函數爲登錄驗證的具體操做,好比用戶驗證是否存在。
(3)服務端驗證成功了,把反饋信息發送給客戶端。
經過上面知道,一端向另外一端發送請求的時候,須要用到socket.emit()方法,可是此次是服務端向客戶端進行發送消息。socket

socket.emit('loginSuccess',data)

這裏,把以前客戶端所發送的請求,再次返回去,讓客戶端進行操做。
(4)客戶端接收返回結果
接收的方法,仍是socket.on(),不過此次是客戶端接收服務端所傳遞回來的信息。tcp

socket.on('loginSuccess',function(data){
        if(data.username === uname){
            checkin(data)
        }else{
            alert('用戶名不匹配,請重試')
        }
    })
   function checkin(data){
    /*隱藏登錄界面,顯示聊天主頁*/
        $('.login-wrap').hide('slow');
        $('.chat-wrap').show('slow');
}

經過以上4步,一次成功的登錄請求就成功了。ide


關於全頻道廣播功能
項目中提到了全頻道的廣播的功能,而io.sockets.emit的定義是服務端進行全頻道廣播,也就是對全部客戶端進行廣播,也跟咱們經常在聊天中收到的官方推送同樣。函數

io.sockets.emit('leave',username)

當用戶進入或者離開時,會進行全頻道廣播,也就是經過io.sockets.emit方法進行。

圖片描述


最後感謝@一岑再也不博主所寫的demo項目,讓我受益不淺。
一岑博主主要文章傳送門:連接描述

相關文章
相關標籤/搜索