nodejs基于WS模块实现WebSocket聊天功能的方法


Posted in NodeJs onJanuary 12, 2018

本文实例讲述了nodejs基于WS模块实现WebSocket聊天功能的方法。分享给大家供大家参考,具体如下:

WebSocket 模块众多,我选择了一个较为简单的模块 进行了实现。

工具:Sublime

技术:Node.js 引用模块 ws

最终效果如下

nodejs基于WS模块实现WebSocket聊天功能的方法

本来打算制作网络画板,因为工作忘记了,这里就简单实现了 群聊功能

没什么好介绍的,网上代码案例太多了,(各位新手主要碰见的问题,可能也就是 node 导入模块问题了)

介绍一下安装模块:

找到安装node 目录,进入到 npm 目录下  运行 cmd 输入

npm install --save ws

源文件呢,最好放在 npm 目录下,就可以引用到了(我也是新手各位见谅)
然后执行 node 源文件.js 就可以访问了呢;

源码:保存 成js 文件就可以了

//https://github.com/websockets/ws/blob/master/doc/ws.md#new-wsserveroptions-callback
var WebSocketServer = require('ws').Server,
  wss = new WebSocketServer({
    port: 3000, //监听接口
    verifyClient: socketVerify //可选,验证连接函数
  });
function socketVerify(info) {
  console.log(info.origin);
  console.log(info.req.t);
  console.log(info.secure);
  // console.log(info.origin);
  // var origin = info.origin.match(/^(:?.+\:\/\/)([^\/]+)/);
  //if (origin.length >= 3 && origin[2] == "blog.luojia.me") {
  //  return true; //如果是来自blog.luojia.me的连接,就接受
  //}
  // console.log("连接",origin[2]);
  return true; //否则拒绝
  //传入的info参数会包括这个连接的很多信息,你可以在此处使用console.log(info)来查看和选择如何验证连接
}
//广播
wss.broadcast = function broadcast(s,ws) {
  // console.log(ws);
  // debugger;
  wss.clients.forEach(function each(client) {
    // if (typeof client.user != "undefined") {
      if(s == 1){
        client.send(ws.name + ":" + ws.msg);
      }
      if(s == 0){
        client.send(ws + "退出聊天室");
      }
    // }
  });
};
// 初始化
wss.on('connection', function(ws) {
  // console.log(ws.clients.session);
  // console.log("在线人数", wss.clients.length);
  ws.send('你是第' + wss.clients.length + '位');
  // 发送消息
  ws.on('message', function(jsonStr,flags) {
    var obj = eval('(' + jsonStr + ')');
    // console.log(obj);
    this.user = obj;
    if (typeof this.user.msg != "undefined") {
      wss.broadcast(1,obj);
    }
  });
  // 退出聊天
  ws.on('close', function(close) {
    try{
      wss.broadcast(0,this.user.name);
    }catch(e){
      console.log('刷新页面了');
    }
  });
});

html 前端源码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>聊天</title>
  <link rel="stylesheet" href="">
  <script language="JavaScript" src="http://code.jquery.com/jquery-1.11.0.js"></script>
  <script type="text/javascript">
  </script>
</head>
<style type="text/css" media="screen">
div {
  border: 1px solid #cccccc;
  width: 500px;
  min-height: 100px;
}
</style>
<body>
  <div id="show">
  </div>
  <input type="text" id="message" name="" value="" placeholder="">
  <input type="text" id="name" value="" placeholder="昵称;">
  <a href="javascript:void(0)" rel="external nofollow" rel="external nofollow" onclick="send()">发送</a>
  <a href="javascript:void(0)" rel="external nofollow" rel="external nofollow" onclick="exit()">退出</a>
  <!-- <input type="text" id="token" name="" value="" placeholder="" readonly="false"> -->
</body>
<script type="text/javascript">
var ws = new WebSocket("ws://127.0.0.1:3000?t=test");
ws.onopen = function() {
  console.log("连接状态", ws);
  $("#show").html("连接状态;" + ws.readyState + "</br>");
  console.log("open");
  ws.open("start");
};
ws.onmessage = function(evt) {
  // console.log(evt.data)
  // alert(evt.data);
  $("#show").append(evt.data + "</br>");
};
ws.onclose = function(evt) {
  console.log("WebSocketClosed!");
  console.log(evt);
};
ws.onerror = function(evt) {
  console.log("WebSocketError!");
};
function send() {
  var msg = $("#message").val();
  var key = $("#token").val();
  var name = $("#name").val();
  var str = "{name:'" + name + "',msg:'" + msg + "',key:'" + key + "'}";
  console.log("发送", str);
  ws.send(str);
};
function exit() {
  var r = ws.close();
  console.log("退出", r);
}
</script>
</html>

聊天中没有做太多验证,名字可以随意改动,

参考

https://github.com/websockets/ws

https://github.com/websockets/ws/blob/master/doc/ws.md

希望本文所述对大家nodejs程序设计有所帮助。

NodeJs 相关文章推荐
Nodejs实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
NodeJS实现客户端js加密
Jan 09 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
详解NODEJS的http实现
Jan 04 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
Nodejs核心模块之net和http的使用详解
Apr 02 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 #NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 #NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 #NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 #NodeJs
详解NODEJS的http实现
Jan 04 #NodeJs
Nodejs中crypto模块的安全知识讲解
Jan 03 #NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 #NodeJs
You might like
15个小时----从修改程序到自己些程序
2006/10/09 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
轮播图组件js代码
2016/08/08 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
python冒泡排序算法的实现代码
2013/11/21 Python
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
介绍信怎么写
2015/01/30 职场文书
公司奖励通知
2015/04/21 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
员工给公司的建议书
2019/06/24 职场文书
创业计划书之家教中心
2019/09/25 职场文书
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS