使用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 显示当前系统时间代码
Dec 28 Javascript
jquery插件 cluetip 关键词注释
Jan 12 Javascript
window.location.hash知识汇总
Nov 09 Javascript
Boostrap基础教程之JavaScript插件篇
Sep 08 Javascript
JSON 数据详解及实例代码分析
Jan 20 Javascript
jQuery输入框密码的显示隐藏【代码分享】
Apr 29 jQuery
JS函数节流和函数防抖问题分析
Dec 18 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
Feb 08 Javascript
vue自定义tap指令及tap事件的实现
Sep 18 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
Jan 07 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
Feb 01 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
Nov 07 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
文件系统基本操作类
2006/11/23 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
php导入模块文件分享
2015/03/17 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
H5移动端适配 Flexible方案
2016/10/24 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
Python中的匿名函数使用简介
2015/04/27 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
Python验证码识别的方法
2015/07/10 Python
python开发之thread线程基础实例入门
2015/11/11 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
中间件的定义
2016/08/09 面试题
会计专业个人求职信范文
2014/01/08 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书