使用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点击页面任何区域实现鼠标焦点十字效果
Jun 21 Javascript
jQuery对html元素取值与赋值的方法
Nov 20 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
Apr 11 Javascript
Jquery实现textarea根据文本内容自适应高度
Apr 03 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 Javascript
js HTML5 Canvas绘制转盘抽奖
Sep 13 Javascript
深入理解jQuery()方法的构建原理
Dec 05 Javascript
JS返回只包含数字类型的数组实例分析
Dec 16 Javascript
javascript实现循环广告条效果
Dec 12 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
Sep 15 Javascript
原生js实现简单轮播图
Oct 26 Javascript
Vue.js中v-for指令的用法介绍
Mar 13 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
php中this关键字用法分析
2016/12/07 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
读jQuery之一(对象的组成)
2011/06/11 Javascript
javascript真的不难-回顾一下基础知识
2013/01/15 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
python使用any判断一个对象是否为空的方法
2014/11/19 Python
Python函数式编程
2017/07/20 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
python使用matplotlib绘制热图
2018/11/07 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
python中return不返回值的问题解析
2020/07/22 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
临床医学应届生求职信
2013/11/06 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers