使用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 相关文章推荐
javascript setTimeout和setInterval计时的区别详解
Jun 21 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
Jun 23 Javascript
JS原型对象的创建方法详解
Jun 16 Javascript
jQuery基于ID调用指定iframe页面内的方法
Jul 06 Javascript
Vuejs第十三篇之组件——杂项
Sep 09 Javascript
JavaScript设计模式之单体模式全面解析
Sep 09 Javascript
微信小程序 支付简单实例及注意事项
Jan 06 Javascript
详解Angular 4.x 动态创建组件
Apr 25 Javascript
JS 设置Cookie 有效期 检测cookie
Jun 15 Javascript
Angular4集成ng2-file-upload的上传组件
Mar 14 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
Jan 21 Javascript
React.js组件实现拖拽排序组件功能过程解析
Apr 27 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常用处理静态操作类
2015/04/03 PHP
php生成与读取excel文件
2016/10/14 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
python实现文件分组复制到不同目录的例子
2014/06/04 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
一百行python代码将图片转成字符画
2021/02/19 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
python中可以声明变量类型吗
2020/06/18 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
学生自我鉴定模板
2013/12/30 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
幼师辞职信范文
2015/02/27 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python
python中pymysql包操作数据库方法
2022/04/19 Python