在一個聊天室系統中,經常使用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
對於第一種,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項目,讓我受益不淺。
一岑博主主要文章傳送門:連接描述