寫在前面:最近很火的“996”話題,可謂是引起一片熱議,馬老師說:能夠996應該是幸運的,996是對奮斗者的一種機遇(記得不是很清楚)。996缺少的是自己的空閑時間了,當我是空閑的時候偶爾996挺好的,但是一旦當我有了自己的愛好和想要做的事情,我肯定會覺得996真的是需要平衡的,會覺得沒有時間去做自己喜歡的事情了,魚與熊掌不可兼得,不論怎樣,健康才是身體996的本錢~~
進入正題:本周的自己學習了nodejs的socket.io部分,嘻嘻,就是可以進行聊天的那種功能,
學知識三重問:是什么?可以做什么?怎樣用?這里就直接說怎么用了,
實現聊天的兩種方式:
1.用ajax異步獲取信息
//這種方法不能實時的聊天
document.getElementById('btn').onclick=function(){
//咦自己直接寫了一個原生的ajax,可以使用jquery的方式來進行ajax
var newcontent=document.getElementById('newinput').value;
var xhr =new XMLHttpRequest();
xhr.open('post','./add');
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send('msg='+ newcontent);
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
var arr= JSON.parse(xhr.responseText);
var html='<ul>';
for(var i=0;i<arr.length;i++){
html+='<li>'+arr[i].username+":"+arr[i].content+" </li>";
}
html+='</ul>';
document.getElementById('box').innerHTML=html;
document.getElementById('newinput').value='';
}
}
}
缺點:利用ajax的缺點在於:不能實時的獲取聊天信息,如果想實時獲取,可以在客戶端進行一個定時查詢,就是設置一個setInterval,每一秒鍾都去取一個數據,~
2:利用socket.io來實現實時的查詢功能
(1)先安裝插件
- 客戶端:socket.io-client - 服務器:koa-socket
(2)nodejs端語言
本次我們使用頁面渲染的方式,將會用到koa-router、fs模塊,因此需要提前拿安裝
const koa =require('koa');
//引入
const Router = require('koa-router');//使用koa路由
const static =require('koa-static');//加載一些靜態的文件
const render =require('koa-art-template');//加載koa模板文件
const path =require('path');//渲染一些頁面,來取一些數據
const session = require('koa-session');
const IO = require( 'koa-socket' )//非常實用本篇核心插件
const bodyParser = require('koa-bodyparser');//用來給頁面傳遞數據解析的post的方法的插件
進行連接
let app =new koa();
//加入socket-io
const io = new IO()
io.attach( app )//附加到app上關聯
io.on( 'connection', ( content ) => {
console.log( '連接上了');
io.broadcast('msgl','我是服務器');
})
//前面引入了許多的插件,需要把插件用上
//引入靜態資源
app.use(static(path.resolve('./public')));
//處理session
app.use(session({store},app))
app.use(router.routes());
//處理響應
app.use(router.allowedMethods());
app.listen(8888);
客戶端連接
<script src="/socket.io/socket.io.js"></script> //需要導入io
<script>
var socket = io('http://127.0.0.1:8888');//去監聽這個地址
//先讓客戶端登錄下,讓服務端保存相關的信息,並登錄
socket.on('connect', function(){
console.log('連接連接上了');
});
3.連接完成后如何進行事件的交互呢
客戶端:
//因為涉及到客戶進行聊天,需要記錄下每個用戶登錄成功后的id
socket.emit('login',{
id:{{id}},
});
服務端記錄用戶上線信息:
io.on('login',context => {
let id = context.data.id;
//存儲現有的用戶消息,存儲socketid,在list頁面加載知乎才存儲到的
global.mySessionStore[id].socketid = context.socket.socket.id;//全局定義的存儲所有上線用戶的socketid
//測試廣播在線上線用戶上線
io.broadcast('online',{
online:global.mySessionStore,
})
//用戶下線的時候進行的操作,刪除這個用戶的信息
context.socket.on('disconnect',(context)=>{
//刪除掉原本存在的id的用戶,然后進行存儲
let socketid = context.socket.socket.id;
let key= findKeyBySocketID(socketid);//刪除這個key
delete global.mySessionStore[key];
io.broadcast('online',{
online:global.mySessionStore,
})
})
});
群發送消息:
客戶端:發送輸入的內容給服務端
//群聊內容
document.getElementById('btn').onclick=function(){
var newcontent=document.getElementById('newinput').value;
//將內容發送給服務端,
socket.emit('sendmsg',{//向服務端傳遞一個sendmsg事件,
newcontent:newcontent,
});
}
服務端:接收客戶端發來的數據,並識別用戶(每個用戶都會有一個socketid作為一個可識別的關鍵點)
//結束用戶的消息
io.on('sendmsg',(context,data)=>{
// context.soclet(客戶端那個連接) context.socket.socketie私聊也能夠
//如何拿到當前sessionid來識別是哪個用戶訪問的。接受用戶的消息,在這里拿到當前用戶的消息
//找到當前是的用戶名字
let obj =findBySocketID(context.socket.socket.id);
msgs.push({username:obj.username,content:data.newcontent});
//廣播到每個的用戶那里
io.broadcast('allmsg',{username:obj.username,content:data.newcontent,type:'all'});
//allmsg是對客戶端一個消息返回事件,此時由客戶端進行監控和返回
});
客戶端接收服務端發來的數據:
socket.on('allmsg',function(data){
console.log(data);
//服務端數據同步過來了,及時更新信息
var ul = document.getElementById('msg');
ul.innerHTML+=`<li><span class="img"></span>
<span class="name">${data.username}</span>
<span class="content">${data.content}</span></li>`;
})
//將返回的信息渲染到頁面上·~嘻嘻,這樣就可以進行群組通信了
所有人通信通信的過程和步驟已經可以了,下一篇將會介紹私發信息
