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

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

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

工具:Sublime

技术:Node.js 引用模块 ws

最终效果如下

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

没什么好介绍的,网上代码案例太多了,(各位新手主要碰见的问题,可能也就是 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程序设计有所帮助。

(0)

相关推荐

  • nodejs 日志模块winston的使用方法

    winston 日志模块 在使用 nodejs winston 模块中,加上相关的两个模块,事倍功半. express-winston winston-daily-rotate-file express-winston 是 express-winston 的 winston 的增加版, 是作为 express 的中间件来打印日志,不仅有请求头信息,并且有响应时间. 作为中间件, 为什么会有响应时间呢? 因为 express-winston 改写了 express 的 res.end 办法, 是请

  • nodejs使用http模块发送get与post请求的方法示例

    本文实例讲述了nodejs使用http模块发送get与post请求的方法.分享给大家供大家参考,具体如下: GET请求 var http = require('http'); var querystring = require('querystring'); var data = { a: 123, time: new Date().getTime()};//这是需要提交的数据 var content = querystring.stringify(data); var options = {

  • nodejs 使用 js 模块的方法实例详解

    Intro# 最近需要用 nodejs 做一个爬虫,Google 有一个 Puppeteer 的项目,可以用它来做爬虫,有关 Puppeteer 的介绍网上也有很多,在这里就不做详细介绍了. node 小白,开始的时候有点懵逼,模块导出也不会. 官方文档上说支持 *.mjs 但是还要改文件扩展名,感觉有点怪怪的,就没用,主要是基于js的模块使用. 模块导出的两种方式# 因为对 C# 比较熟悉,从我对 C# 的理解中,将 nodejs 中模块导出分成两种形式: 1.一个要实例化才能调用的模块 2.

  • Nodejs使用mysql模块之获得更新和删除影响的行数的方法

    在mysql中直接进行这样的判断的方法是使用 row_count(), 这一条语句要紧跟着你执行的sql语句后面. 而Nodejs的i/o都是异步的于是这就产生了一个问题, 不太好判断 row_count()到底是哪句sql执行的结果. 粗略的扫了一眼文档, 文档中并没有描述这个问题. 本想函数嵌套来达到同步的效果的, 却无意发现在执行sql对应的异步函数中的参数中有  affectedRows字段, 经测试, 这货就是 row_count()的结果.实例: 复制代码 代码如下: var cmd

  • Nodejs调用Dll模块的方法

    公司项目采用Electron(electronjs.org/)开发pc应用,会涉及到与底层硬件设备的通信,而sdk封装 基本上都是通过 C++ 动态链接库dll实现的. 有两种方案可供选择: 方案一: 使用node-ffi 方案二: 使用C++编写一个node addon,通过LoadLibrary调用dll 以上两种方案都可以解决dll调用问题,方案选型要个人对C++ 的掌握程度,如果熟悉C++开发,可以直接选择方案二最方便.如果完全不了解C++,那么只能采用方案一. 由于笔主不太懂C++,最

  • nodejs中方法和模块用法示例

    本文实例讲述了nodejs中方法和模块用法.分享给大家供大家参考,具体如下: 在nodejs中方法的调用是怎样的呢? 一起来愉快的写代码吧 . var express = require("express"); var app = express(); var hostName = "127.0.0.1"; var port = 8080; app.all("*",function(req,res,next){ res.header("

  • NodeJs 文件系统操作模块fs使用方法详解

    NodeJs:文件读取API使用方法 - - readFile() 需求:使用Node中提供的文件操作API,读取files目录下的1.txt 文档中文本内容. Node的三个组成部分:ECMAScript核心 + 全局成员 + 核心API成员 核心API成员,在大家安装Node应用程序的时候,就已经安装到了自己的电脑中. 如果想要访问核心成员,直接使用require("核心成员的名称"),就能够导入并使用这些核心成员. const fs = require("fs"

  • 深入学习nodejs中的async模块的使用方法

    最近在学习nodejs,这两天学习了async模块这个地方知识点挺多的,所以,今天添加一点小笔记. async模块是为了解决嵌套金字塔,和异步流程控制而生.常用的方法介绍 npm 安装好async模块,然后引入就可以使用 var async = require('async'); 1. series(tasks,[callback]) 多个函数从上到下依次执行,相互之间没有数据交互 var task1 =function(callback){ console.log("task1");

  • nodejs URL模块操作URL相关方法介绍

    url模块 处理HTTP请求时url模块使用率超高,因为该模块允许解析URL.生成URL,以及拼接URL.首先我们来看看一个完整的URL的各组成部分. 复制代码 代码如下: href  -----------------------------------------------------------------                             host              path                       --------------- --

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

    本文实例讲述了nodejs基于WS模块实现WebSocket聊天功能的方法.分享给大家供大家参考,具体如下: WebSocket 模块众多,我选择了一个较为简单的模块 进行了实现. 工具:Sublime 技术:Node.js 引用模块 ws 最终效果如下 本来打算制作网络画板,因为工作忘记了,这里就简单实现了 群聊功能 没什么好介绍的,网上代码案例太多了,(各位新手主要碰见的问题,可能也就是 node 导入模块问题了) 介绍一下安装模块: 找到安装node 目录,进入到 npm 目录下  运行

  • nodejs结合socket.io实现websocket通信功能的方法

    本文实例讲述了nodejs结合socket.io实现websocket通信功能的方法.分享给大家供大家参考,具体如下: 因为项目中有需要实时获取后台数据的场景,之前一直是使用http心跳请求的方法.因为websocket与此模式相比有很大的性能提升,而且可以提高实时性,所以对websocket作了一些研究.这里是使用nodejs+socket.io来实现的. 达成目标 将原来心跳请求后台数据的方式,修改为通过socket连接后台统一推送的方式.后台的数据由别的进程写入文件或写入redis,这里实

  • node.js ws模块搭建websocket服务端的方法示例

    首先下载websocket模块,命令行输入 npm install ws node.js的 模块ws,可用于创建websocket服务,基本的express 和 http模块的使用 var express = require('express'); var http = require('http'); var WebSocket = require('ws'); var app = express(); var server = http.createServer(app); var wss

  • 基于Socket.IO实现Android聊天功能代码示例

    一.简述 Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket的协议用于实时通信.跨平台的开源框架,它包括了客户端的JavaScript和服务器端的Node.js. 该种官方介绍看起来有点懵逼,简而言之就是:客户端可通过Socket.IO与服务器建立实时通信管道 二.应用 该下就是介绍Socket.IO通信管道的铺设.通信以及销毁工作. 2.1 引入Socket.io包 compile 'io.socket:socket.io-client:0.8.

  • Python网络编程基于多线程实现多用户全双工聊天功能示例

    本文实例讲述了Python网络编程基于多线程实现多用户全双工聊天功能.分享给大家供大家参考,具体如下: 在前面一篇<Python网络编程使用select实现socket全双工异步通信功能>中,我们实现了1对1的异步通信,在文章结尾,给出了多对多通信的思路. 既然说了,咱就动手试一试,本次用的是多线程来实现,正好练练手- 首先讲一下思路: 我们将服务器做为中转站来处理信息,一方面与客户端互动,另一方面进行消息转发. 大体思路确定下来后,需要确定一些通信规则: 1. 客户端与服务器建立连接后,需要

  • nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例

    本文实例讲述了nodejs基于mssql模块连接sqlserver数据库的简单封装操作.分享给大家供大家参考,具体如下: 注意:开启sqlserver服务器允许远程连接的步骤,自行百度,很多经验,nodejs连接sqlserver,最好把防火墙的入站规则关闭,或者允许入站.这个封装只是sql语句查询,看懂这个,其他的可以自行扩展,支持连接池. 一 安装mssql模块 npm install mssql 二 封装连接数据库代码 db.js: /*2016年7月14日17:02:15 QQ: 452

  • Python基于socket模块实现UDP通信功能示例

    本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import socket #使用IPV4协议,使用UDP协议传输数据 s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #绑定端口和端口号,空字符串表示本机任何可用IP地址 s.bind(('', 5000)) while True: data, addr=s.recvfrom(1024) #显示接收到的内容 print(

  • C#基于Socket实现多人聊天功能

    本文实例为大家分享了C#基于Socket实现多人聊天功能的具体代码,供大家参考,具体内容如下 服务器 服务器负责接受所有客户端发来的消息,和将接受到的问题群发到其他用户. 代码: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace ChatRoomService

  • Python基于PyGraphics包实现图片截取功能的方法

    本文实例讲述了Python基于PyGraphics包实现图片截取功能的方法.分享给大家供大家参考,具体如下: 先安安装PyGraphics包 (python import media模块) 有一段代码要import media,打开python自带的IDLE,输入: >>>import media 就会提示没有media这个模块! 原来media模块不是系统的标准模块,需要安装第三方软件后才能用.这个库是在PyGraphics里,不过PyGraphics依赖一些别的库.可以这样安装(可参

  • php基于ob_start(ob_gzhandler)实现网页压缩功能的方法

    本文实例讲述了php基于ob_start('ob_gzhandler')实现网页压缩功能的方法.分享给大家供大家参考,具体如下: PHP生成网页后传送给浏览器显示 ,页面的打开速度除了与用户的网速有关,往往也跟页面的大小有很关系,我们可以从网 页大小着手,以提高网页的响应速度. 下面的代码是一个压缩网页的例子,我们利用ob_gzip函数,使用ob_start将输出内容压缩后放到"缓冲区"后再输出 . PHP代码 //启用压缩 if(function_exists('ob_gzip'))

随机推荐