使用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与prototype框架的详细对比
Nov 21 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
Jan 02 Javascript
js实现防止被iframe的方法
Jul 03 Javascript
Javascript基于AJAX回调函数传递参数实例分析
Dec 15 Javascript
第二篇Bootstrap起步
Jun 21 Javascript
微信小程序  http请求封装详解及实例代码
Feb 15 Javascript
JS时间控制实现动态效果的实例讲解
Jul 31 Javascript
JavaScript实现封闭区域布尔运算的示例代码
Jun 25 Javascript
es6函数之rest参数用法实例分析
Apr 18 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
Aug 07 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
vue实现拖拽交换位置
Apr 07 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中使用数组指针函数操作数组示例
2014/11/19 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
javascript显示选择目录对话框的代码
2008/11/10 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
js实现日历
2020/11/07 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
python zip()函数使用方法解析
2019/10/31 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Python3列表List入门知识附实例
2020/02/09 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
Python下载的11种姿势(小结)
2020/11/18 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
门前三包责任书
2014/04/15 职场文书
先进教师个人总结
2015/02/11 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
严以律己学习心得体会
2016/01/13 职场文书