使用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里使用Dom操作Xml
Jan 22 Javascript
js精度溢出解决方案
Dec 02 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
Aug 27 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
Sep 21 Javascript
JQuery实现倒计时按钮具体方法
Nov 14 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
Sep 24 Javascript
JavaScript对Json的增删改属性详解
Jun 02 Javascript
js中获取jsp表单中radio类型的值简单实例
Aug 15 Javascript
原生javascript实现文件异步上传的实例讲解
Oct 26 Javascript
vue-router history模式下的微信分享小结
Jul 05 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
Aug 13 Javascript
vue封装数字翻牌器
Apr 20 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取进制余数函数代码
2012/01/19 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
Bootstrap表格使用方法详解
2017/02/17 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
Vue的百度地图插件尝试使用
2017/09/06 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
python批量处理txt文件的实例代码
2020/01/13 Python
django中url映射规则和服务端响应顺序的实现
2020/04/02 Python
python如何编写win程序
2020/06/08 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
教师辞职报告范文
2014/01/20 职场文书
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
难忘的一课教学反思
2014/04/30 职场文书
自我推荐信范文
2014/05/09 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
感恩老师主题班会
2015/08/12 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android
mysql全面解析json/数组
2022/07/07 MySQL