利用socket.io来构建一个聊天室,输入自己的id和消息,所有的访问用户都可以看到,类似于群聊。

socket.io

这里只用来做一个简单的聊天室,官网也有例子,很容易就做出来了。其实主要用的东西就是事件监听和触发,on和emit。当socket.io连接成功之后,后台就可以跟浏览器互相通信了。

let io = socket(app);
io.on('connection', socket => {
socket.on('reseive', data => {
io.emit('news', data)
})
});

关于后端

首先构建一个服务器,然后请求时将聊天页面文件返回

const app = http.createServer((req, res) => {
fs.readFile(__dirname+'/index.html', (err, data) => {
if(err){
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}).listen(3003);

这里没什么可说的,别写错路径就行。

index.html

聊天界面只需要将socket.io引入即可

<script src="/socket.io/socket.io.js"></script>

切记,这里不是说在index.html目录下建立这个文件,因为你的聊天页面是通过后端返回的,说以这个路径是在后端的路径,换句话说,你只需要这么写就行了。

然后就是聊天页面中监听来自服务端的消息并显示到页面

socket.on('news', data => {
oDiv.insertAdjacentHTML('beforeend', `<p>
<span class="title">${data.id}</span>
<span class="content">${data.msg}</span>
</p>`);
});

这里我使用了insertAdjacentHTML,这个可能大家没怎么见过,但是很好用,它可以帮你把内容插入到指定位置,当然不是任意位置,有四个位置

//beforebegin
<div>
//afterbegin
content
//beforeend
</div>
//afterend

每次发送到页面消息总是添加到聊天界面的最后。

其他

我们启动服务器之后,都知道退出直接按ctrl+c,但是总会有不小心嘛。我们肯定遇到过有按两次ctrl+c退出和按一次控制台问你是否退出,按y/n。这里也做一个简单的实现(前提:在node中使用process.exit()来退出)。

按两次ctrl+c退出

首先是监听ctrl+c事件

process.on('SIGINT',callback);

在回调函数中我们可以做一些控制,使得用户两次ctrl+c之后再退出

let isExit = false;
process.on('SIGINT', () => {
if(isExit){
isExit = false;
process.exit();
}else{
isExit = true;
process.stdout.write('Please ^C again to exit this process\n');
let timer = setTimeout(function(){
clearTimeout(timer);
isExit = false;
},3000);
} })

当然我们为了防止用户按了一次之后很久没按,再次按的时候会退出,三秒之后会重置。

按一次退出并询问

这个跟上面相似,只不过,在按了一次之后提示用户要输入y/n,这里监控用户输入即可。

let isExit = false;
let reset = () => {
let timer = setTimeout(() => {
clearTimeout(timer);
isExit = false;
}, 5000)
}
process.on('SIGINT', () => {
isExit = true;
reset();
process.stdout.write('Are you sure exit this process? Y/N\n'); }) process.stdin.on('data', (data) => { if(!data){ }else if(data.toString().trim().toLowerCase() === 'y' && isExit){
process.exit();
}else{
process.stdout.write('\n');
}
})

注意点就是监控输入的时候,回调函数中的data不是string,要转一下,data.toString().trim()。

详细代码地址https://github.com/Stevenzwzhai/socket.io_chatRoom

利用socket.io构建一个聊天室的更多相关文章

  1. node+express+socket.io制作一个聊天室功能

    首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js var http=require("http ...

  2. Express+Socket.IO 实现简易聊天室

    代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...

  3. 使用socket.io打造公共聊天室

    最近的计算机网络课上老师开始讲socket,tcp相关的知识,当时脑袋里就蹦出一个想法,那就是打造一个聊天室.实现方式也挺多的,常见的可以用C++或者Java进行socket编程来构建这么一个聊天室. ...

  4. AngularJS+Node.js+socket.io 开发在线聊天室

    所有文章搬运自我的个人主页:sheilasun.me 不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍 ...

  5. Socket.io文字直播聊天室的简单代码

    直接上代码吧,被注释掉的主要是调试代码,和技术选型的测试代码 var app = require('express')(); var server = require('http').Server(a ...

  6. Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室

    一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...

  7. vue + socket.io实现一个简易聊天室

    vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那 ...

  8. 利用socket.io+nodejs打造简单聊天室

    代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  9. 基于react+react-router+redux+socket.io+koa开发一个聊天室

    最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...

随机推荐

  1. 如何在CRM WebClient UI里使用HANA Live Report

    1. 使用业务角色ANALYTICSPRO登录SAP CRM WebClient UI: 点击新建按钮创建一个新的HANA live report: 类型选择SHL: 弹出窗口,维护report的名称 ...

  2. SQL SERVER 下:1、递归查询父分类下的各个子分类。 2、查询每个商品分类中最贵的前两个商品SQL

    1.递归查询父分类下的各个子分类.表设计: SQL: --CTE 语句(适用于MSSQL2005以后版本) with cte_testNavi(Id,Name,Pid ) as ( --这是查询语句 ...

  3. RPC&ORM

  4. 1993: C语言实验——最值

    1993: C语言实验——最值 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1541  Solved: 727[Submit][Status][Web ...

  5. 2017.9.18 include指令和include动作有什么区别?

    问题:include指令和include动作有什么区别? 答:include指令合并静态文档或Jsp页面中的内容,可以用于包括动态生成的输出结果,因此可以包含一个Servlet include指令在编 ...

  6. php开启短标签支持

    打开php.ini,找到 short_open_tag = Off ,将 Off 改为 On

  7. HDU.2111 Saving HDU(贪心)

    题目来源:Saving HDU 题意分析: XHD有个容量为v的口袋,有n个宝贝,每种宝贝的价值不一样,每种宝贝单位体积的价格也不一样,宝贝可以分割,分割后的价值和对应的体积成正比.求XHD最多能取回 ...

  8. Java分享笔记:FileOutputStream流的write方法

    /*------------------------ FileOutputStream: ....//输出流,字节流 ....//write(byte[] b)方法: 将b.length个字节从指定字 ...

  9. SAP标准导出功能 - 删除默认选定格式

    我们经常会使用SAP系统的标准功能导出ALV显示的数据,一般会选择电子表格. 选择电子表格之后,需要选择电子表格的具体格式. 选择格式之后点击确定,会弹出保存对话框. 如果在使用这个功能的时候,选择了 ...

  10. spring-mybatis整合异常

    Failed to read artifact descriptor for XXXXXX:jar:XXXX.RELEAS 原因是maven的本地仓库没有设置好.在别处拷贝过来的项目会有自己的仓库位置 ...