使用socket.io制做简易WEB聊天室


Posted in Javascript onJanuary 02, 2018

使用socket.io做一个简单的WEB聊天室,可消息私发,供大家参考,具体内容如下

1. 创建一个空的工程目录

空的目录命名为chat-web

2. 创建package.json

使用命令:npm init,会引导你设置package.json的内容.

3.安装依赖包

使用命令:

npm install --save express 
npm install --save socket.io

安装完成后你会在工程目录看见有自动生成的node_modules文件夹

4.编写index.js脚本

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
 console.log("dir:" + __dirname);
 res.sendFile( __dirname + '/index.html');
});
//所有注册用户的socket集合(socketMap)
var sm = {};
io.on('connection', function(socket){
 socket.on('chat-reg',function(data){
  console.log("chat-reg:" + JSON.stringify(data));
  //注册 :data 格式:{user:"alisa"}
  //消息 :data 格式:{user:"alisa",msg:"@someone hello!!!"}
  //格式说明:msg内容以@符号开头,以空格分隔用户名和消息体的说明是私聊
  sm[data.user] = socket;
  socket.emit('chat-reg',{code:200,msg:"reg success"});
 });
 socket.on('chat-data',function(data){

  console.log("chat-data:" + JSON.stringify(data));
  if(data.msg[0] == '@'){//以@符号开头,说明这句消息是私聊
   //将消息显示在自己的聊天记录上
   socket.emit('chat-data',data);
   //查找第一个空格的位置
   var i = data.msg.indexOf(' ');
   //得到用户名
   var u = data.msg.substring(1,i);
   //得到消息体
   var m = data.msg.substring(i,data.msg.length);
   if(typeof sm[u] != 'undefined'){
    //在socket集合中得到目标用户的socket,并且发送消息事件
    sm[u].emit('chat-data',{user:data.user,msg:"[private]" + m});
   }
  }else{
   //不是以@开头的消息发送给所有连接的用户
   io.sockets.emit('chat-data',data);
  }
 });
});
//监听在3000端口
http.listen(3000, function(){
 console.log('listening on:3000');
});

5.写index.html

<!doctype html>
<html>
<head>
 <title>私人聊天室</title>
 <style>
 * { margin: 0; padding: 0; box-sizing: border-box; }
 body { font: 13px Helvetica, Arial; }
 form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
 form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
 form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
 #messages { list-style-type: none; margin: 0; padding: 0; }
 #messages li { padding: 5px 10px; }
 #messages li:nth-child(odd) { background: #eee; }

 #info{
  height: 50px;
  text-align: center;
  line-height: 50px;
  background-color: #333;
  color: white;
 }
 </style>
</head>
<body>
 <div id="info"></div>
 <ul id="messages"></ul>
 <form action="">
 <input id="m" autocomplete="off" /><button>Send</button>
 </form>
 <script src="http://cdn.bootcss.com/socket.io/1.7.1/socket.io.min.js"></script>
 <script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
 <script>
 //页面加载的时候随机生成一个用户名
 var user = "user" + Math.floor(Math.random()*1000);
 //打开一个socket,io()方法可以有namespace参数,默认为`/`,具体用法见官方
 var socket = io();
 //发送一个用户注册事件,在服务器端注册用户名
 socket.emit('chat-reg',{user:user});
 //将用户名显示在信息栏
 $("#info").text("您的用户名:"+user);
 $('form').submit(function(){
  //发送聊天信息
  socket.emit('chat-data', {user:user,msg:$('#m').val()});
  $('#m').val('');
  return false;
 });
 //监听服务端发送的聊天信息,并将其显示在页面中
 socket.on('chat-data', function(data){
  $('#messages').append($('<li>').text("[" + data.user + "]:" + data.msg));
 });
 //注册成功后,在控制台显示返回的信息
 socket.on('chat-reg',function(data){
  console.log(JSON.stringify(data));
 });
 </script>
</body>
</html>

6.测试

在控制台工程目录下运行node index.js.
在浏览器中访问:localhost:3000
你会看到下图

使用socket.io制做简易WEB聊天室

你可以多打开几个浏览器窗口,模拟多个用户。
赶紧动手试试效果吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Dom加载让图片加载完再执行的脚本代码
May 15 Javascript
javascript 日历提醒系统( 兼容所有浏览器 )
Apr 07 Javascript
jquery下为Event handler传递动态参数的代码
Jan 06 Javascript
js 获取时间间隔实现代码
May 12 Javascript
jQuery操作元素css样式的三种方法
Jun 04 Javascript
浅析JavaScript 调试方法和技巧
Oct 22 Javascript
js下拉菜单生成器dropMenu使用方法详解
Aug 01 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
Sep 19 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
Sep 22 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
Jan 08 Javascript
JS栈stack类的实现与使用方法示例
Jan 31 Javascript
ant design vue的form表单取值方法
Jun 01 Vue.js
AngularJS实现的简单拖拽功能示例
Jan 02 #Javascript
AngularJS实现的锚点楼层跳转功能示例
Jan 02 #Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
Jan 02 #jQuery
Node实战之不同环境下配置文件使用教程
Jan 02 #Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
Jan 02 #jQuery
Node解决简单重复问题系列之Excel内容的获取
Jan 02 #Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
Jan 02 #Javascript
You might like
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
Three.JS实现三维场景
2018/12/30 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
python3 求约数的实例
2019/12/05 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
任意存:BOXFUL
2018/05/21 全球购物
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
超市促销实习自我鉴定
2013/09/23 职场文书
电信专业毕业生推荐信
2013/11/18 职场文书
领导证婚人证婚词
2014/01/13 职场文书
高三政治教学反思
2014/02/06 职场文书
给学校的建议书范文
2014/05/15 职场文书
小数乘法教学反思
2016/02/22 职场文书
Python图像处理之图像拼接
2021/04/28 Python
Python源码解析之List
2021/05/21 Python