利用socket.io构建一个聊天室
利用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构建一个聊天室的更多相关文章
- node+express+socket.io制作一个聊天室功能
		
首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js var http=require("http ...
 - Express+Socket.IO 实现简易聊天室
		
代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...
 - 使用socket.io打造公共聊天室
		
最近的计算机网络课上老师开始讲socket,tcp相关的知识,当时脑袋里就蹦出一个想法,那就是打造一个聊天室.实现方式也挺多的,常见的可以用C++或者Java进行socket编程来构建这么一个聊天室. ...
 - AngularJS+Node.js+socket.io 开发在线聊天室
		
所有文章搬运自我的个人主页:sheilasun.me 不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍 ...
 - Socket.io文字直播聊天室的简单代码
		
直接上代码吧,被注释掉的主要是调试代码,和技术选型的测试代码 var app = require('express')(); var server = require('http').Server(a ...
 - Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室
		
一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...
 - vue + socket.io实现一个简易聊天室
		
vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那 ...
 - 利用socket.io+nodejs打造简单聊天室
		
代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...
 - 基于react+react-router+redux+socket.io+koa开发一个聊天室
		
最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...
 
随机推荐
- 如何在CRM WebClient UI里使用HANA Live Report
			
1. 使用业务角色ANALYTICSPRO登录SAP CRM WebClient UI: 点击新建按钮创建一个新的HANA live report: 类型选择SHL: 弹出窗口,维护report的名称 ...
 - SQL SERVER 下:1、递归查询父分类下的各个子分类。 2、查询每个商品分类中最贵的前两个商品SQL
			
1.递归查询父分类下的各个子分类.表设计: SQL: --CTE 语句(适用于MSSQL2005以后版本) with cte_testNavi(Id,Name,Pid ) as ( --这是查询语句 ...
 - RPC&ORM
 - 1993: C语言实验——最值
			
1993: C语言实验——最值 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 1541 Solved: 727[Submit][Status][Web ...
 - 2017.9.18  include指令和include动作有什么区别?
			
问题:include指令和include动作有什么区别? 答:include指令合并静态文档或Jsp页面中的内容,可以用于包括动态生成的输出结果,因此可以包含一个Servlet include指令在编 ...
 - php开启短标签支持
			
打开php.ini,找到 short_open_tag = Off ,将 Off 改为 On
 - HDU.2111 Saving HDU(贪心)
			
题目来源:Saving HDU 题意分析: XHD有个容量为v的口袋,有n个宝贝,每种宝贝的价值不一样,每种宝贝单位体积的价格也不一样,宝贝可以分割,分割后的价值和对应的体积成正比.求XHD最多能取回 ...
 - Java分享笔记:FileOutputStream流的write方法
			
/*------------------------ FileOutputStream: ....//输出流,字节流 ....//write(byte[] b)方法: 将b.length个字节从指定字 ...
 - SAP标准导出功能 - 删除默认选定格式
			
我们经常会使用SAP系统的标准功能导出ALV显示的数据,一般会选择电子表格. 选择电子表格之后,需要选择电子表格的具体格式. 选择格式之后点击确定,会弹出保存对话框. 如果在使用这个功能的时候,选择了 ...
 - spring-mybatis整合异常
			
Failed to read artifact descriptor for XXXXXX:jar:XXXX.RELEAS 原因是maven的本地仓库没有设置好.在别处拷贝过来的项目会有自己的仓库位置 ...