WebSocket 通信 —— 浏览器原生支持

news2024/12/23 13:27:45

         在上一篇内容中讲到使用Node中的Net核心模块完成socket通信,那么本篇就继续来讲关于浏览器原生支持的 WebSocket ,实现通信。那么什么是 WebSocket ? 它是HTML5开始提供的一种浏览器与服务器间进行全双工(全双工:同时进行双向传输)通讯的网络技术,客户端和服务器之间的数据交换变得更加简单,关于 websocket 可以干嘛以及关于 websocket 的一些相关,如与 HTTP 的关联等这些可以翻一下这篇文章 WebSocket 相关知识 | 黑马 。

        在 npm 上最流行的 websocket 库有 ws ,socket.io 以及其他像 websocket-node 这些,那么本篇是引入使用这个 ws ,在下一篇中再来使用这个 socket.io ;上面已经讲述了 WebSocket 是用于"在网络应用中保持和服务器端进程双边通讯的",该功能和传统的HTTP协议仅能由客户端发起请求服务器进行响应有所区别。 在实现上,websocket协议分为 官方实现 和 非官方实现 ,ws是最流行的 websocket 库,它完全支持官方实现,在浏览器中不需要引入其他的包,直接可以使用浏览器原生 WebSocket 实现功能,这也就是本篇内容要讲的浏览器原生支持 WebSocket 并实现WebSocket 通信。

引入 ws 

        打开CMD命令窗口切到目录下,通过如下命令安装 ws库 :

npm i ws

— 服务端

[ 与上一篇的socket流程思路差不多,只是这次引入使用不是Node提供的Net模块,而是 ws ]

// var ws = require('ws')
// var WebSocketServer = ws()

var WebSocketServer = require('ws')()
    wss = new WebSocketServer({port : 9000})

var clientMap = new Object()  // 存储用户对象
var i = 0                     // 连接用户流水号  1:- 2:
var onlineUserCount = 0       // 在线用户数量

// 连接
wss.on('connection',function (ws) {
    console.log('已有客户端接入...')
    ws.name = ++i             // 用户的名称递增
    client[ws.name] = ws
    onlineUserCount++
    console.log('当前在线:',onlineUserCount)

    ws.on('message',function (message) {
        broadcast(message, ws)   // 广播
    })

    ws.on('close',function () {
        console.log('客户端 - ' + ws.name + ' 下线了')
        onlineUserCount--
    })

    ws.on('error',function (err) {
        console.log('Error:' + err )
    })
})


// 事件广播
function broadcast(msg, ws) {
    for(var key in clientMap){
        clientMap[key].send( client.name + ' : ' + msg )
    }
}

— 客户端

        在篇目开头讲到 websocket 支持官方实现,浏览器中不需要引入其他的包,直接可以使用浏览器原生的 websocket 实现;下面来实现这样一个客户端效果:

[ 与服务器取得连接,连接地址一般以 ws:// 开头,刚在服务端已经定义好了端口号,所以接入的地址为 ws://127.0.0.1:9000/ ]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>客户端</title>
    <style>
        .chatroom{
            height: 400px;
            width: 220px;
            border: 1px solid blue;
            padding: 5px;
            overflow: scroll;
        }
        .footer{
            margin-top: 10px;
        }
    </style>
</head>
<body>
    <h3>WebSocket 客户端</h3>
    <div id="chatroom" class="chatroom">

    </div>
    <div class="footer">
        <input type="text" name="sayinput" id="sayinput" value="" />
        <input type="button" name="send" id="sendbutton" value="发送" />
    </div>

    <!-- <script src="./WebSocketClient.js" charset="utf-8"></script> -->
    <script type="text/javascript">

        // WebSocketClient
        var ws = new WebSocket('ws://127.0.0.1:9000/')
        ws.onopen = function () {
            ws.send('-- 上线 --')
        }

        ws.onmessage = function (event) {
            var chatroot = document.querySelector('#chatroom')
            chatroot.innerHTML += '</br>' + event.data
        }

        ws.onclose = function () {
            alert('WebSocket服务 已关闭')
        }

        ws.onerror = function (err) {
            alert('Error:' + err)
        }

        function send() {
            ws.send(sayinput.value)
            sayinput.value = ''
        }
        // 回车发送
        document.onkeyup = function (event) {
            if (event.keyCode == 13){
                send()
            }
        }
        // 按钮发送
        sendbutton.onclick = function () {
            send()
        }
    </script>
</body>
</html>

—— WebSocket 测试运行

· 启动服务端 ——  node  WebSocketServer.js

· 打开编写完成的 Client.html 文件 —— 浏览器 

 · 在客户端中输出信息且发送

· 再开启第二个客户端,根据设置的用户流水号,应该是 '2' 会上线:

 · 从客户端2发送消息会被广播,可以在客户端1聊天窗口看到内容:

· 关闭客户端2,服务器会提示有用户下线

· 关闭掉服务端,看客户端是否有反馈

        以上就是关于 WebSocket 建立连接实现简单的通信,在下一篇中会使用 socket.io 来实现该功能,那么本篇内容就到此结束,感谢大家的支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

激活函数(Activation Function)及十大常见激活函数

目录 1 激活函数的概念和作用 1.1 激活函数的概念 1.2 激活函数的作用 1.3 通俗地理解一下激活函数&#xff08;图文结合&#xff09; 1.3.1 无激活函数的神经网络 1.3.2 带激活函数的神经网络 2 神经网络梯度消失与梯度爆炸 2.1 简介梯度消失与梯度爆炸 2.2 梯度不稳…

asp.net+C#房地产销售系统文献综述和开题报告+Lw

本系统使用了B/S模式&#xff0c;使用ASP.NET语言和SQL Server来设计开发的。首先把所有人分为了用户和管理员2个部分&#xff0c;一般的用户可以对系统的前台进行访问&#xff0c;对一般的信息进行查看&#xff0c;而注册用户就可以通过登录来完成对房屋信息的查看和对房屋的…

动态通讯录——C语言【详解+全部码源】

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;进阶C语言&#xff0c;本专栏主要讲解数据存储&#xff0c;进阶指针&#xff0c;动态内存管理&a…

企业数据安全能力建设思路

在现代社会&#xff0c;企业数据安全已经成为一个非常重要的话题。企业数据安全能力的建设是每个企业都必须面对和解决的问题。企业数据安全能力建设思路包括以下几个方面&#xff1a; 1. 建立完善的安全管理制度 企业要建立完善的安全管理制度&#xff0c;包括信息安全政策、…

[入门必看]数据结构5.1:树的基本概念

[入门必看]数据结构5.1&#xff1a;树的基本概念 第五章 树与二叉树5.1 树的基本概念知识总览5.1.15.1.2 树的定义和基本术语5.1.3 树的性质 5.1.15.1.2 树的定义和基本术语树的基本概念树形逻辑结构的应用结点之间的关系描述结点、树的属性描述有序树 V.S 无序树树 V.S 森林 5…

软考 软件设计师上午题uml

UML uml事物依赖关系关联聚合组合关系泛化关系实现关系关联多重度UML类图UML 类图的概念对象图用例图包含关系扩展关系泛化关系用例图概念交互图通信图![在这里插入图片描述](https://img-blog.csdnimg.cn/d62c6f00d57a48949e3306461f3fbe25.png)通信图例子状态图状态图的状态和…

# 生成器

生成器 生成器是什么&#xff1f; 生成器&#xff08;generator&#xff09;是一种用来生成数据的对象。它们是普通函数的一种特殊形式&#xff0c;可以用来控制数据的生成过程。 生成器有什么优势&#xff1f; 使用生成器的优势在于它们可以在生成数据的同时控制数据的生成过程…

android ContentObserver实时监测媒体图片增删改,java(1)

android ContentObserver实时监测媒体图片增删改,java&#xff08;1&#xff09; <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.READ_MEDIA_IMAGES" /> impl…

七、JS07使用 jQuery 操作 DOM

七、使用 jQuery 操作 DOM 7.1 DOM 操作 7.1.1 DOM 操作分类 使用 JavaScript 操作 DOM 时分为三类——DOM Core(核心)、HTML-DOM 和 CSS-DOMjQuery 操作也同样分为这三类下面主要回顾以下 JavaScript 中的 DOM 操作 JavaScript 中的 getElementById()、getElementByTagName…

c++内联函数inline

目录 内联函数的概念&#xff1a; 内联函数的用法&#xff1a; 内联的优点&#xff1a; 内联的缺点&#xff1a; 内联的使用场景 内联注意事项&#xff1a; 内联函数的概念&#xff1a; C中内联&#xff08;inline&#xff09;是一种关键字&#xff0c;用于告诉编译器把函…

以太网和DNS

以太网 数据链路层考虑的是相邻俩个节点之间的传输(通过网线/光纤/无线直接相连的设备),数据链路层中最典型的协议就说"以太网" 以太网协议规定了数据链路层,也规定了物理层的内容,我们使用的网线,也叫做"以太网线"(遵守以太网协议的网线) 以太网帧格式…

使用RecyclerView开发TabView

github链接 demo代码 效果图 这个功能是使用RecyclerView开发的&#xff0c;需要解决下面这些问题 单个item滚动的问题&#xff1a;左边的view需要固定、手指松开之后&#xff0c;惯性的处理滑动布局子View事件分发冲突的解决多个item联合滚动滚动header解决itemView与Recycl…

【MYSQL】表的增删改查(进阶)

文章目录 &#x1f337; 1. 数据库约束⭐ 1.1 约束类型⭐ 1.2 NULL约束⭐ 1.3 UNIQUE&#xff1a;唯一约束⭐ 1.4 DEFAULT&#xff1a;默认值约束⭐ 1.5 PRIMARY KEY&#xff1a;主键约束⭐ 1.6 FOREIGN KEY&#xff1a;外键约束⭐ 1.7 CHECK约束&#xff08;了解&#xff09; …

实在智能创意沙画引爆第25届“海博会”,数字员工为电商超自动化转型加“数”

4月18日&#xff0c;由中国纺织工业联合会、中国服装协会、中国服装设计师协会、台湾纺织业拓展会主办&#xff0c;石狮市人民政府指导的第二十五届海峡两岸纺织服装博览会暨科技成果交易会&#xff08;下称“海博会”&#xff09;在石狮市举行。本届海博会以“融合创新、共享时…

Android Jetpack 应用指南 - Navigation

前言 在Android开发的过去几年中&#xff0c;在公司的项目中一直没有机会尝试单Activity多Fragment的开发模式&#xff0c;随着Google推出Navigation组件&#xff0c;我意识到&#xff0c;终于有机会学习一种全新的开发模式了。 与上一篇文章相同&#xff0c;本篇同样是Navig…

Lenovo IdeaPad S540-14IML 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Lenovo IdeaPad S540-14IML 2019 (Type 81NF) 处理器Intel Core i5-10210U / i7-10510U已驱动 内存Internal 4GB 2666 Changeable 8GB 2666 memo…

Android进程间通信

在操作系统中&#xff0c;每个进程都有一块独立的内存空间。为了保证程序的的安全性&#xff0c;操作系统都会有一套严格的安全机制来禁止进程间的非法访问&#xff0c;但是&#xff0c;很多情况下进程间也是需要相互通信的 进程间通信&#xff08;Inter-process communication…

嵌入式学习笔记——SPI通信的应用

SPI通信的应用 前言屏幕分类1.3OLED概述驱动芯片框图原理图通信时序显示的方式页地址、列地址初始化指令 程序设计初始化代码初始化写数据与写命令清屏函数 初始化代码字符显示函数 总结 前言 上一篇中介绍了STM32的SPI通信&#xff0c;并根据框图和寄存器进行了SPI通信的初始…

轻松掌握k8s(使用docker)安装知识点

1、介绍 kubernetes具有以下特性&#xff1a; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器&#xff0c;如果进入容器的流量很大&#xff0c; Kubernetes 可以负载均衡并分配网络流量&#xff0c;从而使部署稳定。存储编排 Kubernetes 允许你自…

【数据库】— 无损连接、Chase算法、保持函数依赖

【数据库】— 无损连接、Chase算法 Chase算法Chase算法举例一种简便方法&#xff1a;分解为两个模式时无损连接和函数依赖的一个简单例子 Chase算法 形式化定义&#xff1a; 构造一个 k k k行 n n n列的表格&#xff0c;每行对应一个模式 R i ( 1 ≤ i ≤ k ) Ri (1≤i ≤ k)…