利用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. 使用ecilpse(Java)调用Matlab代码

    1 安装java环境: http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK最新版本并安装,CloudSim ...

  2. C#自定义规则对比两个集合的对象是否相等

    IList<获取的类> ret = 类的结果集; return ret.Except(另一个相同类型的对象列表集, new AClassComPare()): public class A ...

  3. 立体最短路径,广搜(POJ2251)

    题目链接:http://poj.org/problem?id=2251 参考了一下大神们的解法.也有用深搜的.然而,之前不久看到一句话,最短路径——BFS. 参考:http://blog.csdn.n ...

  4. 数集合有多少个TOJ(2469)

    题目链接:http://acm.tju.edu.cn/toj/showp2469.html 感觉这个题目有点问题,算了不管他了,反正A了. 这里要注意的是求这个集合有多少种,那么就是要剔除重复数后,再 ...

  5. js日期转换Fri Oct 31 18:00:00 UTC+0800 2008转换为yyyy-mm-dd

    Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d ...

  6. ajaxfileup.js

    <img id="tinyPic" class="user-icon" :src="headPortrait"><inpu ...

  7. ElasticSearch 集群原理

    节点 一个运行中的EasticSearch 被称为一个节点,而集群是由多个用于拥有相同cluster.name配置的节点组成,它们共同承担数据和负载的压力,当有新的节点加入或移除,集群会重新平均分布所 ...

  8. hasOwnProperty自我理解

    暂时不考虑ES6中symbol,hasOwnProperty()方法返回的是一个对象上是否包含一个指定属性,如果含有则返回true,如果没有则返回false.   和 in 运算符不同,该方法会忽略掉 ...

  9. echarts零基础快速入门

    第一步:得到这个dom对象.然后进行各种操作. var myChart = echarts.init(document.getElementById('item1')); 第二步:所有的配置项全部放在 ...

  10. ajax原生js及readystate/status

    菜鸟教程 ←← GET: <script> function  ajaxGet(){ var  xmlhttp; if(window.XMLHttpRequest){ //TE7+  Fi ...