nodejs使用websocket

2023-11-02

一、websocket简介

首先要知道什么是几个常用的互联网传输协议:http、https、tcp、udp
1. http

超文本传输协议(HyperText Transfer Protocol)是一种无状态协议,就是说客户端发送一次请求,服务器端接收请求,经过处理返回给客户端信息,然后客户端和服务器端的链接就断开了。

2. https

(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

优点: 协议较成熟,应用广泛、基于TCP/IP,拥有TCP优点、研发成本很低,开发快速、开源软件较多,nginx,apache,tomact等
缺点: 无状态无连接、只有PULL模式,不支持PUSH、数据报文较大
特性: 基于TCP/IP应用层协议、无状态,无连接、支持C/S模式、适用于文本传输
3. TCP

TCP是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂。建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。

优点: 可靠性 、全双工协议、开源支持多、应用较广泛、面向连接、研发成本低、报文内容不限制(IP层自动分包,重传,不大于1452bytes)
缺点: 操作系统:较耗内存,支持连接数有限、设计:协议较复杂,自定义应用层协议、网络:网络差情况下延迟较高、传输:效率低于UDP协议特性: 面向连接、可靠性、全双工协议、基于IP层、OSI参考模型位于传输层、适用于二进制传输
4. UDP

UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

优点: 操作系统:并发高,内存消耗较低、传输:效率高,网络延迟低、传输模型简单,研发成本低
缺点: 协议不可靠、单向协议、开源支持少、报文内容有限,不能大于1464bytes、设计:协议设计较复杂、网络:网络差,而且丢数据报文
特性:无连接,不可靠,基于IP协议层,OSI参考模型位于传输层,最大努力交付,适用于二进制传输
5.webSocket:

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

优点:协议较成熟、基于TCP/IP,拥有TCP优点、数据报文较小,包头非常小、面向连接,有状态协议、开源较多,开发较快
缺点:没发现啥缺点
特性:有状态,面向连接、数据报头较小、适用于WEB3.0,以及其他即时联网通讯
 对于通信协议选择方面:
大多数互联网web网页项目,都是选择的http/https协议。

实时性对战较高的互联网游戏,聊天程序,异步通知等应用,大多数都是选择websocket,其次是TCP协议。

局域网对战,赛车等大量数据交互,要求传输速度快,并发量高的,直接上UDP协议。

二、websocket简单的服务器

nodejs websocket server代码:
// 引入WebSocket模块
var ws = require('nodejs-websocket')
var PORT = 3000
 
// on就是addListener,添加一个监听事件调用回调函数
// Scream server example:"hi"->"HI!!!",服务器把字母大写
var server = ws.createServer(function(conn){
    console.log('New connection')
    conn.on("text",function(str){
        console.log("Received"+str)
        conn.sendText(str.toUpperCase()+"!!!") //大写收到的数据
        //conn.sendText(str)  //收到直接发回去
    })
    conn.on("close",function(code,reason){
        console.log("connection closed")
    })
    conn.on("error",function(err){
        console.log("handle err")
        console.log(err)
    })
}).listen(PORT)
 
html client代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>WebSocket</title>
</head>
<body>
    <h1>Echo Test</h1>
    <input id="sendTxt" type="text"/>
    <button id="sendBtn">发送</button>
    <div id="recv"></div>
    <script type="text/javascript">
        // //官方示例的服务器
        // var WebSocket = new WebSocket("ws://echo.websocket.org");
        // wsServer搭建的服务器
        var WebSocket = new WebSocket("ws://localhost:3000/");
        WebSocket.onopen = function(){
            console.log('websocket open');
            document.getElementById("recv").innerHTML = "Connected";
        }
        WebSocket.onclose = function(){
            console.log('websocket close');
        }
        WebSocket.onmessage = function(e){
            console.log(e.data);
            document.getElementById("recv").innerHTML = e.data;
        }
        document.getElementById("sendBtn").onclick = function(){
            var txt = document.getElementById("sendTxt").value;
            WebSocket.send(txt);
        }
    </script>
</body>
</html>


欢迎关注问我团队公众号:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nodejs使用websocket 的相关文章

  • Puppeteer 的行为与开发者控制台不同

    我正在尝试使用 Puppeteer 提取此页面的标题 https www nordstrom com s zella high waist studio pocket 7 8 leggings 5460106 https www nords
  • 谷歌应用程序引擎nodejs本地开发

    有没有办法在本地运行我的nodejs应用程序 以便我可以模拟在生产App Engine中运行的应用程序而无需部署它 由于某种原因 我的应用程序在 Google App Engine 中的行为与我的本地主机不同 我厌倦了每次为了查看是否存在错
  • MongoDB 和 Mongoose 访问一个数据库,同时针对另一个数据库进行身份验证(NodeJS、Mongoose)

    我有几个数据库 不想为每个数据库创建单独的用户帐户 MongoDB 支持使用另一个数据库中定义的帐户来验证对数据库的访问的概念 但语法示例很难获得 当我终于弄清楚时 我正准备提出一个问题 如果它对其他人有帮助 就放在这里 这是 mongod
  • 找不到模块:无法解析 @google-cloud/storage 上的“fs”

    得到Module not found Can t resolve fs 尝试从 GCP Storage 列出存储桶时出错 import Storage from google cloud storage const googleCloud
  • Google 钱包 API Codelabs 示例权限被拒绝

    我正在研究使用 Google 钱包通过 Web jwt 界面存储条形码 用于电子处方 如果重要的话 的可行性 https codelabs developers google com add to wallet web 0 https co
  • Node.js 重用 MongoDB 参考

    我无法理解 Node js 例如 MongoDB 访问 这是我得到的 mydb js var mongodb require mongodb server new mongodb Server staff mongohq com 10030
  • 在 TypeScript 中将 Chai 自定义插件声明为 NodeJS 全局变量

    这是我之前的问题 https stackoverflow com questions 61676032 declare nodejs global variables in before hook in webdriverio using
  • Windows 上的 Node.js 和 Express

    今晚 我决定尝试在我的 Windows 7 计算机上使用 Express 构建一个简单的 Node js 应用程序 安装过程还算顺利 但 Express 拒绝配合 以下是我已采取的步骤 使用以下位置提供的 MSI 安装 Node jshtt
  • Node.js“需要”其他文件而不需要命名空间

    我正在将代码库从 100 浏览器端切换为浏览器端和服务器端的混合 我发现的问题是 要让我的代码使用 node js 运行 我必须使用模块 为了将我的代码变成模块 需要对几乎所有代码进行巨大的重构 原因是在浏览器上 许多功能是跨文件使用的 而
  • npm install 的 --save 选项是什么?

    我看到一些教程 其中命令是 npm install save 什么是 save选项是什么意思 更新 npm 5 As of npm 5 0 0 http blog npmjs org post 161081169345 v500 安装的模块
  • 永远运行 Gulp 脚本?

    是否可以运行 Gulp 脚本forever https www npmjs com package forever 我有 Gulp 脚本想要作为守护进程运行 所以我可以启动 停止 列出它 好的 所以我通过将 gulp 二进制文件从 usr
  • 错误:模块“html”不提供视图引擎(Express)

    我正在尝试设置一个简单的路由应用程序 但在渲染页面时不断遇到错误 Error Module html does not provide a view engine 奇怪的是我已经在 app js 文件中指定了视图引擎 但仍然收到错误 app
  • 如何在 Alexa 中循环播放音频

    我正在为 Alexa 构建睡眠环境音频技能 我正在尝试循环播放音频 这样我就不必下载 10 小时版本的音频 如何让音频正常工作 我将其构建到将播放音频但不循环播放的位置 我已经在我的造雨者技能中解决了这个问题 https www amazo
  • 没有导出的成员/节点模块

    我刚刚开始使用 5 分钟快速入门找到的 Angular 2 Typescripthere https angular io docs ts latest quickstart html 我遇到了一个看起来很常见的问题 但可能有点不同 我遇到
  • Google API、drive.files.list 和仅返回子文件

    我正在使用 谷歌API https www npmjs com package googleapis NodeJS 中的库 我试图返回当前指定文件夹中的文件和文件夹列表 但我发现drive files list返回用户已被授予读取权限的所有
  • 如何让我的云代码在我的 Worker dyno(而不是 Web dyno)上运行?

    我在heroku 上部署了一个解析服务器 我正在解析服务器上运行一些云代码 该代码需要几分钟才能运行 并且在 Web dyno 上运行时会导致 Heroku 出现超时错误 heroku router at error code H12 de
  • 获取telegram群组的所有用户

    我正在尝试获取电报组的所有用户 我看到方法 getChatAdministrators 但我认为 API 没有获取所有成员的方法 我正在使用nodejs的telegram bot api Telegram 机器人 API https cor
  • 在生产中使用 babel-node 可以吗

    我一直在使用 babel node 和 browserify 以及 babelify 转换来开发一个网站 以支持 ES6 语法 我只是想知道 我可以在生产中运行它吗 babel node server 而不是 node server 要在
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • npm 错误! cb.apply 不是函数

    我收到这个错误 npm ERR cb apply is not a function 在Linux中做的时候npm install虽然我的npm版本是6 9 0 我的节点版本是v12 18 3 如何解决这个问题 如果您共享的是 Window

随机推荐

  • qtxml生成与解析

    目录 xml生成 xml解析 xml生成 void Qxml setTml QDomDocument doc xml文档树的创建 xml文档树的指令版本必有的 QDomProcessingInstruction pi doc createP
  • LINUX安装nginx详细步骤,部署web前端项目

    1 安装依赖包 一键安装上面四个依赖 yum y install gcc zlib zlib devel pcre devel openssl openssl devel 2 下载并解压安装包 可以去https nginx org down
  • 华为OD机试真题- 跳房子I-2023年OD统一考试(B卷)

    题目描述 跳房子 也叫跳飞机 是一种世界性的儿童游戏 游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格 跳房子的过程中 可以向前跳 也可以向后跳 假设房子的总格数是count 小红每回合可能连续跳的步数都放在数组steps中 请问
  • java 多线程提高大数据量的读写效率

    对于多线程来说 刚开始是比较蒙的 不了解其中的运行机制 最近项目中需要用多线程解决一个加载缓慢的问题 特此写了一个例子 供大家参考 如有建议 请多指教 哈哈哈 那么 话不多说 先说下需求 此接口供xxx公司调用 实现对数据库的读取和修改 而
  • 官宣了!Apache ECharts 毕业成为 Apache 软件基金会顶级项目!

    2021 年 1 月 26 日 德克萨斯州威明顿市 Apache 软件基金会 ASF 是 350 多个开源项目和计划的全志愿开发者 管理者和孵化者 今天宣布 Apache ECharts 成为顶级项目 TLP Apache ECharts
  • Python爬虫的urlib的学习(学习于b站尚硅谷)

    目录 一 页面结构的介绍 1 学习目标 2 为什么要了解页面 html 3 html中的标签 仅介绍了含表格 无序列表 有序列表 超链接 4 本节的演示 二 Urllib 1 什么是互联网爬虫 2 爬虫核心 3 爬虫的用途 4 爬虫的分类
  • IDEA如何导出导入配置文件

    导出配置 打开工具 找到 file gt export setting 选择路径即可 导出的是setting jar文件 导入配置 file gt import setttings gt 选则jar文件 gt 一路确认 gt 重启
  • 多线程常见面试题

    常见的锁策略 这里讨论的锁策略 不仅仅局限于 Java 乐观锁 vs 悲观锁 锁冲突 两个线程尝试获取一把锁 一个线程能获取成功 另一个线程阻塞等待 乐观锁 预该场景中 不太会出现锁冲突的情况 后续做的工作会更少 悲观锁 预测该场景 非常容
  • 优雅的代码命名规范,代码如诗

    优雅的代码命名规范 管理类命名 传播类命名 回调类命名 监控类命名 内存管理类命名 过滤检测类命名 结构类命名 常见设计模式命名 解析类命名 网络类命名 CRUD命名 其他 END 日常编码中 代码的命名是个大的学问 能快速的看懂开源软件的
  • canvas详解05-变形

    几何变换 canvas现在被大量地运用于游戏等动画领域 最主要的归功于它提供的一系列几何变换方法 使得动画更加地容易 所以其几何变换是非常重要的一节 在本教程前面的部分中 我们已经了解了 Canvas 网格和坐标空间 到目前为止 我们只是根
  • 解决:The Apache Tomcat Native library which allows optimal performance in production environments was

    在启动Tomcat 6 0时发现第一条信息便是 The Apache Tomcat Native library which allows optimal performance in production environments was
  • 用C++编写一个猜数字游戏

    系统随机生成一个1到100之间的数字 玩家进行猜测 如果猜错 提示玩家数字过大或过小 如果猜对恭喜玩家胜利 并且推出游戏 include
  • RocketMQ rocketmq_client.log日志文件配置

    1 默认路径 项目添加RocketMQ以后启动项目时会在user home下创建一个rocketmq client log日志文件 文件全路径是 user home logs rocketmqlogs rocketmq client log
  • 日语动词变形(概念明确篇)

    首先 日语中的动词我们可以这样看 这是几种不同的分法 相互之间没有关联 A 一段动词 五段动词 変动词 変动词 B 自动词 他动词 按照属性来区分 C 意志动词 非意志动词 只包含部分日语动词 在动词变形上 我们只涉及第一种分法 其他两种这
  • UE4 开房 多人在线动作游戏------学习笔记

    先创建好UI界面 这个UI是用来创建房间 查找房间 进入房间和退出的 这个UI是用来显示搜索出来的房间 然后点击进入房间的 用了监听 别人才能搜索到服务器 点击开始搜索 显示搜索图标 开始对查找Listen的关卡 查找成功生成ServerB
  • 本地笔记软件_笔记软件obsidian重大更新

    obsidian是一个笔记软件 之前写了篇obsidian的介绍 https zhuanlan zhihu com p 212204160 zhuanlan zhihu com 这次obsidian发布了0 91版本 真正变得实用了 首先说
  • springmvc

    1 SpringMVC简介 1 1 什么是MVC MVC是一种软件架构的思想 将软件按照模型 视图 控制器来划分 M Model 模型层 指工程中的JavaBean 作用是处理数据 JavaBean分为两类 一类称为实体类Bean 专门存储
  • Camunda流程引擎笔记(四):Send Task,Receive Task

    流程引擎中 Send Task和 Service Task拥有相同的行为 都是通过回调Java代码完成相应逻辑 通常 Send Task和 Receive Task配合使用 一 Send Task 绘制一个Send Task流程 配置过程和
  • 网页服务器请求响应,网页的请求响应,你们所看到的网页跳转长这样子

    Servlet的认识在上一篇文章有介绍过 如有不同看法或者其他理解的话可以下方留言给我 我肯定虚心学习 说一说Servlet 网友说 有点料 我们生活在这一个互联网时代 每天都点击数据 交互数据 响应数据和请求数据 以上几个技术点 你能想到
  • nodejs使用websocket

    一 websocket简介 首先要知道什么是几个常用的互联网传输协议 http https tcp udp 1 http 超文本传输协议 HyperText Transfer Protocol 是一种无状态协议 就是说客户端发送一次请求 服