写在前面:最近很火的“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>`;
})
//将返回的信息渲染到页面上·~嘻嘻,这样就可以进行群组通信了

  所有人通信通信的过程和步骤已经可以了,下一篇将会介绍私发信息

nodejs之socket.io 聊天实现的更多相关文章

  1. Socket.IO聊天室~简单实用

    小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...

  2. nodejs+express+socket.io

    其实官网文档清楚了  https://socket.io/get-started/chat/ 但是因为之前写的是nodejs+express, socket.io是后加的, 还是有小坑 服务器端: 官 ...

  3. 【招聘App】—— React/Nodejs/MongoDB全栈项目:socket.io&聊天实现

    前言:最近在学习Redux+react+Router+Nodejs全栈开发高级课程,这里对实践过程作个记录,方便自己和大家翻阅.最终成果github地址:https://github.com/66We ...

  4. 使用nodejs引用socket.io做聊天室

    Server: var app = require('http').createServer(handler) , io = require('socket.io').listen(app) , fs ...

  5. 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)

    上次的nodejs操作arduino入门篇中实现了如何连接arduino.这次我们来实现通过arduino测量室内温度并在浏览器上显示出来. [所需材料] 硬件:LM35温度传感器,arduino u ...

  6. NodeJS+Express+Socket.io的一个简单例子

    关键字:NodeJS,Express,Socket.io. OS:Windows 8.1 with update pro. 1.安装NodeJS:http://nodejs.org/. 2.初始化一个 ...

  7. nodejs之socket.io模块——实现了websocket协议

    Nodejs实现websocket的4种方式:socket.io.WebSocket-Node.faye-websocket-node.node-websocket-server,主要使用的是sock ...

  8. nodejs的socket.io学习笔记

    socket.io学习笔记 1.服务器信息传输: 2.不分组,数据传输: 3.分组数据传输: 4.Socket.io难点大放送(暂时没有搞定): 服务器信息传输 1. // send to curre ...

  9. NodeJS + Socket.io聊天服务器连接数达到1024后就连不上了

    如果是亚马逊的Engine Yard服务器,解决办法为: 1.查看端口占用情况,找到nodejs进程号,例如我这里是8000端口 lsof -i:8000  找到pid 例如为 8213 2.设置no ...

随机推荐

  1. 【转载】MYSQL模式匹配:REGEXP和like用法

    转载地址:http://www.webjx.com/database/mysql-32809.html like like要求整个数据都要匹配,而REGEXP只需要部分匹配即可. 也就是说,用Like ...

  2. 探索式软件测试—Exploratory Software Testing

    最近找到去年上半年看过一本关于测试方面书籍的总结笔记,一直放在我的个人U盘里,当时是用Xmind记录的,现在重新整理下分享给大家了! James A.Whittaker [美] 詹姆斯·惠特克(软件测 ...

  3. 【小梅哥SOPC学习笔记】SOPC开发常见问题及解决办法集锦

    SOPC开发常见问题及解决办法集锦 一.Symbol 'NULL' could not be resolved 近期在评估使用NIOS II处理器进行项目的开发,我使用的软件是Quartus II 1 ...

  4. 【Linux】Vim编辑器

    本文基于Debian 1.vim使用简介 1.1vim安装 使用apt安装vim即可: sudo apt-get install vim 1.2 vim编辑器的模式 vim编辑器分为命令模式和编辑模式 ...

  5. Echarts X轴内容过长自动隐藏,鼠标移动上去显示全部名称方法

    最近公司做项目,使用echarts做开发,碰到一些数据的名称很长导致图例展示的效果不是很好,自己写了一个方法,当X轴内容过长时自动隐藏,鼠标移动上去显示全部名称 样例: 图二是鼠标移动到名称显示的,怎 ...

  6. Android ActionBar使用方法

    对于这ActionBar我想很多人都想了解一下到底是怎么一个使用方法,以及它都存在哪些可操作的和使用的地方.如下图所示:<ignore_js_op> 这便是ActionBar的基本内容.获 ...

  7. ref 和 out 的用法和区别以及params用法

    方法参数可以划分为一下四种类型1 值参数:声明时不含任何修饰符2 引用参数:以ref修饰符声明3 输出参数:以out修饰符声明4 参数数组:以params修饰符声明 引用参数和输出参数不创建新的存储位 ...

  8. 按照已有的模板输出<一>(如发票)

    按照已有的模板输出<一> 普通的发票基本上都是固定模式,所以我们一般写好固定的模板,把其中需要变动的地方,以特定符号来代替.每次打印发票的时候,只需将其中的特定符号转换成我们需要显示的数据 ...

  9. 提高SQL Server数据库效率常用方法

    1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...

  10. [Cocos2d-x for WP8学习笔记] 一些基本概念,建立自己的启动界面

    流程控制:场景是相对不变的游戏元素集合,游戏在场景间的切换就是流程控制. 场景.层和精灵:它们是不同层次的游戏元素.通常,场景包含层,层包含精灵,场景与层是其他游戏元素的容器,而精灵是展示给玩家的图形 ...