使用socket.io实现多房间通信聊天室
websocket的实现有很多种,像ws和socket.io,这里使用的是socket.io来实现多房间的效果。
这里的使用没有使用socket.io
官方提供的namespace
和room
,而是完全通过一个namespace
实现的。数据传输使用JSON
格式,封装了消息规范
消息体规范
const actionType = {
join:'JOIN',//加入
leave:'LEAVE',//离开
talk:'TALK',//消息
action:'ACTION',//用户操作
push:'PUSH'//系统推送
}//消息体
class MSG {
constructor(type,body){
this.type = type;
this.body= body;
}
}复制代码
安装使用
npm install socket.io-rooms --save
demo演示
使用方式
服务端Server
const {User,Rooms} = require('./index')
const server = require('http').createServer();
const io = require('socket.io')(server); //大厅
io.on('connection', client => {
let user = new User();
client.emit('user',user);
client.on('join', data => {
/* 加入某个房间 */
Rooms.join(data,user,io,client)
});
client.on('message',msg=>{
if(user.roomId){
// io.to(user.roomId).emit('message',msg)
if(msg.type == 'update'){
user.update(msg.body);
}
msg.user = user.uid;
Rooms.send(user.roomId,msg)
}else{
io.emit('message',msg)
}
console.log(msg)
})
client.on('disconnect', () => {
/* … */
console.log("连接断开")
Rooms.leave(user)
});
});
server.listen();
客户端调用Client
const socket = io('http://localhost');
log =(...args)=>{
document.getElementById('log').innerHTML +='<br/>'+args.map(item=>JSON.stringify(item)).join(' ')+'=>'+(+new Date());
} log(socket.id)
let user ={},room,client;
socket.on('connect', (c) => {
log('connect ...', socket.id);
socket.on('user',u=>{
user = u;
log('用户ID',u.uid)
});
});
socket.on('message',msg=>{
log('message:',msg)
});
function joinroom(num){
//加入房间号为1的房间
socket.emit('join',num);
}
function send(){
let msg = document.getElementById('msg').value;
socket.emit('message',{type:'TALK',body:msg})
// setInterval(function(){
// socket.emit('message',{type:'TALK',body:+new Date()})
// },2000)
}
在用户信息上,为了增加扩展性,添加了update
的操作类型进行同步用户信息,这在实际中很有用。
代码很简单,就是两个类的实现, Rooms
和User
类,这里没有限定房间的数量,可以在初始化的时候先固定房间名和数量。源码托管于github,地址为:github.com/tianxiangbi… ,如果觉得有用,加颗小星星吧
websocket的实现有很多种,像ws和socket.io,这里使用的是socket.io来实现多房间的效果。
这里的使用没有使用socket.io
官方提供的namespace
和room
,而是完全通过一个namespace
实现的。数据传输使用JSON
格式,封装了消息规范
消息体规范
const actionType = {
join:'JOIN',//加入
leave:'LEAVE',//离开
talk:'TALK',//消息
action:'ACTION',//用户操作
push:'PUSH'//系统推送
}//消息体
class MSG {
constructor(type,body){
this.type = type;
this.body= body;
}}
安装使用
npm install socket.io-rooms --save
demo演示
使用方式
服务端Server
const {User,Rooms} = require('socket.io-rooms')
const server = require('http').createServer();
const io = require('socket.io')(server);
//大厅
io.on('connection', client => {
let user = new User();
client.emit('user',user);
client.on('join', data => {
/* 加入某个房间 */
Rooms.join(data,user,io,client)
});
client.on('message',msg=>{
if(user.roomId){
// io.to(user.roomId).emit('message',msg)
if(msg.type == 'update'){
user.update(msg.body);
}
msg.user = user.uid;
Rooms.send(user.roomId,msg)
}else{
io.emit('message',msg)
}
console.log(msg)
})
client.on('disconnect', () => {
/* … */
console.log("连接断开")
Rooms.leave(user)
});
});
server.listen(80);
客户端调用Client
const socket = io('http://localhost');
log =(...args)=>{
document.getElementById('log').innerHTML +='<br/>'+args.map(item=>JSON.stringify(item)).join(' ')+'=>'+(+new Date());
}
log(socket.id)
let user ={},room,client;
socket.on('connect', (c) => {
log('connect ...', socket.id);
socket.on('user',u=>{
user = u;log('用户ID',u.uid)
});
});
socket.on('message',msg=>{
log('message:',msg)
});
function joinroom(num){
//加入房间号为1的房间
socket.emit('join',num);
}
function send(){
let msg = document.getElementById('msg').value;
socket.emit('message',{type:'TALK',body:msg}) setInterval(function(){
socket.emit('message',{type:'TALK',body:+new Date()})
},2000)
}
在用户信息上,为了增加扩展性,添加了update
的操作类型进行同步用户信息,这在实际中很有用。
代码很简单,就是两个类的实现, Rooms
和User
类,这里没有限定房间的数量,可以在初始化的时候先固定房间名和数量。源码托管于github,地址为:https://github.com/tianxiangbing/rooms ,如果觉得有用,加颗小星星吧
使用socket.io实现多房间通信聊天室的更多相关文章
- 9、socket.io,websocket 前后端实时通信,(聊天室的实现)
websocket 一种通信协议 ajax/jsonp 单工通信 websocket 全双工通信 性能高 速度快 2种方式: 1.前端的websocket 2.后端的 socket.io 一.后端so ...
- 使用node.js + socket.io + redis实现基本的聊天室场景
在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对 ...
- 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室
原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- vue.js+socket.io+express+mongodb打造在线聊天
vue.js+socket.io+express+mongodb打造在线聊天 在线地址观看 http://www.chenleiming.com github地址 https://github.com ...
- vue.js+socket.io+express+mongodb打造在线聊天[二]
vue.js+socket.io+express+mongodb打造在线聊天[二] 在线地址观看 http://www.chenleiming.com github地址 https://github. ...
- java 用socket制作一个简易多人聊天室
代码: 服务器端Server import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{ ...
- Android进阶(十五)socket通信——聊天室
想做一个聊天室,花费了将近一天的时间,各种错误.讲解知识点之前,絮叨几句:动手能力还是很重要的,有时看似简单的一个问题,当你真正着手去解决的时候就有可能会遇到各种各样的问题,原因之一就是因为你的知识储 ...
- nodejs构建多房间简易聊天室
1.前端界面代码 前端不是重点,够用就行,下面是前端界面,具体代码可到github下载. 2.服务器端搭建 本服务器需要提供两个功能:http服务和websocket服务,由于node的事件驱动机制, ...
随机推荐
- javascript 代码实例
数组去重 function unique(arr){ if(!Array.isArray(arr)){ console.log('type error!'); return; } arr = arr. ...
- LOJ6587 WF2019 交通堵塞 CRT、bitset
传送门 首先设\(P = lcm(r_i + g_i)\),因为\(P \mid 2019!\),所以在\([0,2019!]\)里随机实数相当于在\([0,2019!)\)随机实数,相当于在\([0 ...
- c# webapi 过滤器token、sign认证、访问日志
1.token认证 服务端登录成功后分配token字符串.记录缓存服务器,可设置有效期 var token = Guid.NewGuid().ToString().Replace("-&qu ...
- Java 理论和实践: 了解泛型 识别和避免学习使用泛型过程中的陷阱
Brian Goetz (brian@quiotix.com), 首席顾问, Quiotix 简介: JDK 5.0 中增加的泛型类型,是 Java 语言中类型安全的一次重要改进.但是,对于初次使用泛 ...
- treeMultiselect 去掉勾选项
场景描述:弹窗,显示树形结构,节点层次可变(可只有一级节点,也可是多级节点),限制只能选择一个节点! 1.修改jquery.tree-multiselect.min.js 文件 2.前台页面 参考代码 ...
- IIS配置文件的XML格式不正确 applicationHost.config崩溃
错误提示如图: 检查C:\Windows\System32\inetsrv\config目录下的applicationHost.config文件,备份一份. 可使用IIS提供的AppCmd.exe的r ...
- 【OO学习】OO第三单元作业总结
[OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...
- Office 365 的安装与激活
(1)Office 365的安装,本处使用的是Office Tool Plus. (2)等待安装完成 (3)重头戏激活 , 使用命令行方式 (不推荐) 以下内容,新建文本文件,然后保存为.bat,再以 ...
- Jmeter学习笔记(九)——响应断言
Jmeter中又一个元件叫断言,用于检查测试中得到的响应数据等是否符合预期.断言又13种,目前在使用过程中使用到的是响应断言. 有时候请求成功了并不代表测试通过,还要看影响返回的内容是否符合预期的结果 ...
- 使用企业证书给iOS应用重签
来源:https://github.com/sailtsao/iReSign 这里有个开源的签名工具,已经修改为支持dylib frameworks等的签名了,使用这个签名不会出现任何问题 iReSi ...