使用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 相关文章推荐
js cookies 常见网页木马挂马代码 24小时只加载一次
Apr 13 Javascript
调试代码导致IE出错的避免方法
Apr 04 Javascript
IE浏览器不支持getElementsByClassName的解决方法
Aug 27 Javascript
13个PHP函数超实用
Oct 21 Javascript
JavaScript中自带的 reduce()方法使用示例详解
Aug 10 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 Javascript
bootstrap下拉框动态赋值方法
Aug 10 Javascript
详解JavaScript中操作符和表达式
Sep 12 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
Jun 24 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
Oct 14 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
May 14 Javascript
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通过COM类调用组件的实现代码
2012/01/11 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
vue实现购物车列表
2020/06/30 Javascript
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
使用python装饰器验证配置文件示例
2014/02/24 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
详解python中的 is 操作符
2017/12/26 Python
Python Grid使用和布局详解
2018/06/30 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
外贸公司实习自我鉴定
2013/09/24 职场文书
股份合作协议书范本
2014/04/14 职场文书
2015年市场部工作总结
2015/04/30 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
MySQL基础(一)
2021/04/05 MySQL
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP
浅谈JS的二进制家族
2021/05/09 Javascript