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 28 NodeJs
Nodejs进程管理模块forever详解
Jun 01 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
详解nodejs http请求相关总结
Mar 31 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
Express.JS使用详解
2014/07/17 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
通过JS判断联网类型和连接状态的实现代码
2015/04/01 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
2019/02/21 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
Python单例模式实例详解
2017/03/01 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
python复合条件下的字典排序
2020/12/18 Python
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
阿拉伯书店:Jamalon
2019/07/24 全球购物
清洁工岗位职责
2014/01/29 职场文书
村党支部公开承诺书
2014/05/29 职场文书
幼儿园端午节活动方案
2014/08/25 职场文书
财产分割协议书范本
2014/11/03 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
Mysql Show Profile
2021/04/05 MySQL