koa socket即時通訊的示例代碼
前言
http的特點是一問一答,而即時通訊是需要雙向通信的,這樣以前的即時通信只能使用輪詢的方式通過周期性的ajax請求獲取數(shù)據(jù),直到websocket出現(xiàn),就完美實現(xiàn)了雙向通信
一 即時通訊方式簡介
段輪詢
前臺使用setInterval進行定時請求后臺,這樣無疑非常浪費性能
長輪詢和長連接(html5的EventSource)
客服端連接一次,服務(wù)端不斷開連接,服務(wù)端接收到新消息就發(fā)送給前臺,客服端和服務(wù)端保持一直連接,缺點是只有服務(wù)端向客服端輸出
websocket
websocket不再是走http協(xié)議,而是升級為websocket協(xié)議,說到底就是走應(yīng)用層協(xié)議(tcp),實現(xiàn)雙向通信,缺點是兼容性問題(ie11)
socket.io
上面的方式都存在一定問題,自然就有人封裝一套完美的解決方案,socket.io就是集合了上面幾種方案的另一種解決方案
二 即時通信實現(xiàn)
客服端
引入包:<script src="https://cdn.socket.io/socket.io-1.2.1.js";></script>
服務(wù)端和客服端通過on和emit進行交互
- emit表示發(fā)送,事件名自定義,另一端用on進行接收
- on表示接受,類似jq綁定事件,事件名對應(yīng)emit事件名
- connect,disconnect是連接和斷開事件
// 建立連接
var socket= io('http://localhost:80')
// on表示接收
// emit表示發(fā)送
socket.on('connect', function () {
console.log('連接上了')
// 登錄,同步前后端信息
// 請求后端login接口,寫入socketid
socket.emit('login', {
// 身份標識,可以是時間戳或者唯一id,最要用來回去socketid進行私聊
id: username
})
})
// 發(fā)送消息,這里可以用發(fā)送事件進行消息發(fā)送
socket.emit('sendMsg', {
newAccount: 'xxxxxx'
})
// 接收消息
socket.on('msg1', function (data) {
// 可以對數(shù)據(jù)進行渲染
console.log(data)
})
socket.on('allmessage', function (data) {
// 接收所有人消息
console.log(data);
})
// 表示連接斷開了
socket.on('disconnect', function () {
console.log('聊天服務(wù)器斷開了')
})
服務(wù)端(koa+koa-socket)
安裝koa-socket
npm i koa2 koa-socket -S
const IO = require('koa-socket')
const Koa = require('koa2')
const io = new IO()
const app = new Koa()
// 將socket和app關(guān)聯(lián)
io.attach(app)
// 和客服端進行連接
io.on('connection', (context) => {
console.log('連接上了')
})
// 接收消息
io.on('sendMsg', function (context) {
//console.log(context.data)
// 向客服端實時發(fā)送消息
io.broadcast('msg1', '我是服務(wù)器來的')
// 廣播,所有人消息
io.broadcast('allmessage', context.data.newAccount)
})
// 處理登陸同步信息
io.on('login', context => {
let id = context.data.id;
console.log(context);
});
總結(jié)
上面就是koa-socket使用的簡單介紹,只實現(xiàn)了簡單的消息推送和接收,后面還有私聊和群發(fā),其原理是獲取到每個用戶的socketid,發(fā)送消息時對應(yīng)發(fā)送,后面再進行更新
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決下載了nodejs但npm?-v沒有反應(yīng)問題的全過程
最近工作中遇到了個問題,node安裝成功,但npm無法使用,所以下面這篇文章主要給大家介紹了關(guān)于下載了nodejs但npm?-v沒有反應(yīng)問題解決的相關(guān)資料,需要的朋友可以參考下2022-08-08
Node.js設(shè)置定時任務(wù)之node-schedule模塊的使用詳解
node-schedule是 Node.js 的一個定時任務(wù)(crontab)模塊。這篇文章主要介紹了Node.js設(shè)置定時任務(wù)之node-schedule模塊的使用,需要的朋友可以參考下2020-04-04
Linux CentOS系統(tǒng)下安裝node.js與express的方法
這篇文章主要給大家介紹了在Linux CentOS系統(tǒng)下安裝node.js與express的方法,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04
基于docker搭建node環(huán)境開發(fā)服務(wù)器全過程
這篇文章主要給大家介紹了關(guān)于如何基于docker搭建node環(huán)境開發(fā)服務(wù)器的相關(guān)資料,本文將采用docker技術(shù)部署一個簡單的nodejs應(yīng)用,文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11
vscode調(diào)試node.js的實現(xiàn)方法
這篇文章主要介紹了vscode調(diào)試node.js的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03

