使用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 相关文章推荐
jquery实现动态操作select选中
Feb 11 Javascript
通过正则表达式获取url中参数的简单实现
Jun 07 Javascript
jQuery layui常用方法介绍
Jul 25 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
Nov 11 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 Javascript
jQuery密码强度验证控件使用详解
Jan 05 Javascript
解决给dom元素绑定click等事件无效问题的方法
Feb 17 Javascript
React Native实现进度条弹框的示例代码
Jul 17 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
Mar 23 Javascript
vue计算属性get和set用法示例
Feb 08 Javascript
写一个Vue Popup组件
Feb 25 Javascript
前端JS获取URL参数的4种方法总结
Apr 05 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
PHP 程序员应该使用的10个组件
2009/10/31 PHP
PHP开发负载均衡指南
2010/07/17 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
php查看当前Session的ID实例
2015/03/16 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
详解webpack介绍&amp;安装&amp;常用命令
2017/06/29 Javascript
浅谈React中的元素、组件、实例和节点
2018/02/27 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
Python基于numpy灵活定义神经网络结构的方法
2017/08/19 Python
简单实现python数独游戏
2018/03/30 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
Python 如何查找特定类型文件
2020/08/17 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
风之谷观后感
2015/06/11 职场文书
关于远足的感想
2015/08/10 职场文书
同学聚会祝酒词
2015/08/10 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
浅谈MySQL中的六种日志
2022/03/23 MySQL
Nginx如何配置根据路径转发详解
2022/07/23 Servers