WebSocket 是 HTML5 提供的一种在单个TCP连接上进行全双工通讯的协议。

WebSocket 使得客户端和服务端通讯,数据交换更加简单,而且允许服务端主动向客户端发送数据。在WebSocket API 中,浏览器和服务器只需要完成一次握手,就可以建立一条持久性的通道,进行数据的双向传输。

现在,很多的网站的推送技术是依然使用ajax轮询。轮询是在一定时间间隔后,由浏览器发送请求到服务器,然后获得服务器返回的最新的数据。这种方式,明显的缺点就是浏览器需要不断地发送请求,而请求可能包含较长的头部,真正有效的只有一小部分,造成了宽带资源的浪费。一直请求加重了服务端的压力。

HTML5定义的WebSocket协议,更更好的节省宽带和服务器资源,能够进行实时通讯,而且是服务端可控的,当数据没有更新时,可以不用传送数据。

浏览器通过JavaScript向服务器发送建立WebSocket链接的请求,链接建立后,服务器和浏览器端就可以通过TCP连接直接交换数据了。

当获取WebSocket连接后,可以通过 send() 方法向服务器发送数据,并通过 onmessage 事件来监听服务端返回的数据。

相关的API:

1、创建 WebSocket 对象:new WebSocket(url [, protocol ])

 const socket = new WebSocket('ws://localhost:2333');

关于url,MDN 说应该使用 wss:// 模式。我这是使用vscode 本地连接可以使用 ws://

MDN原文:MDN传送门

The URL to which to connect; this should be the URL to which the WebSocket server will respond. This should use the URL scheme wss://, although some software may allow you to use the insecure ws:// for local connections.

第二个可选参数,规定可接受的子协议。一个服务器可以实施多个WebSocket子协议,比如希望一个服务器根据指定的协议处理不同类型的交互。不指定则为空字符串。

2、onopen 监听连接建立时执行。

         // 指定链接成功后的回调
socket.onopen = function () {
console.log('这是连接成功后的回调')
} socket.addEventListener('open', function(event) {
console.log('链接上了 == ', event)
// socket.send(1)
})

3、onmessage 监听服务端返回的数据,然后执行回调函数。

         // 指定从服务器接收消息时的回调
socket.onmessage = function(event) {
console.log('onmessage == ', event.data)
} socket.addEventListener('message', function(event) {
console.log('message from server == ', event.data)
})

4、onerror 监听发生错误时的情况。

         // 指定链接失败后的回调
socket.onerror = function(event) {
console.log('链接错误 == ', event)
} socket.addEventListener('error', function(event) {
console.log('addEventListener error == ', event)
})

5、onclose 监听WebSocket关闭。

         // 指定链接关闭后的回调
socket.onclose = function() {
alert('链接已关闭,后续操作无效')
} socket.addEventListener('close', function() {
console.log('close link')
})

on事件的执行会先于对应的 addEventListener。

6、WebSocket 还有几个只读属性。

             // 用于返回服务器端选中的子协议的名字;这是一个在创建WebSocket 对象时,在参数protocols中指定的字符串
console.log( 'socket protocol == ', socket.protocol )
// 返回当前 WebSocket 的链接状态。
// 0:连接中;1:已连接且可通讯;2:正在关闭;3:连接已关闭或没有连接成功
console.log( 'socket readyState == ', socket.readyState )
// 构造函数创建WebSocket实例对象时URL的绝对路径。
console.log( 'socket url == ', socket.url )
// 返回服务器已选择的扩展值。目前,链接可以协定的扩展值只有空字符串或者一个扩展列表。
console.log( 'socket extensions == ', socket.extensions )
// 返回已经被send()方法放入队列中但还没有被发送到网络中的数据的字节数。一旦队列中的所有数据被发送至网络,则该属性值将被重置为0。但是,若在发送过程中连接被关闭,则属性值不会重置为0。如果你不断地调用send(),则该属性值会持续增长。
console.log( 'socket bufferedAmount == ', socket.bufferedAmount )

更详细点击查看MDN

WebSocket--客户端的更多相关文章

  1. 【转】SocketRocket:iOS WebSocket客户端开源框架

    原文网址:http://blog.csdn.net/zmp1123/article/details/44015507 WebSocket: WebSocket通信协议实现的是基于浏览器的原生socke ...

  2. 火币网行情获取的websocket客户端

    从验证结果看应该是网络关闭了,不过程序写的不错,可以作为其它websocket客户端的测试程序 # !/usr/bin/env python # -*- coding: utf-8 -*- # aut ...

  3. HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端

    HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端 发表时间:2020-03-05 1 ...

  4. netty系列之:使用netty搭建websocket客户端

    目录 简介 浏览器客户端 netty对websocket客户端的支持 WebSocketClientHandshaker WebSocketClientCompressionHandler netty ...

  5. JAVA实现websocket客户端

    pom依赖 <dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-We ...

  6. Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例

    在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...

  7. node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...

  8. 用JAVA分别实现WebSocket客户端与服务端

    最近公司在搞一个项目刚好需要用到WebSocket技术来实现实时数据的传输,因为之前也没接触过,所以捣鼓了好些天,最近恰巧有空就写写.有误的地方还请大牛们能及时指正. 项目背景:基于spring+sp ...

  9. netty实现websocket客户端(附:测试服务端代码)

    1,客户端启动类 package test3; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import ...

  10. 原创:Javascript Websocket客户端封装

    调试中,马马虎虎能用var LeesWebSocket = function (options) { this.defaults = { host: "127.0.0.1", po ...

随机推荐

  1. centos7 更换为aliyun的yum源

    rm -f /etc/yum.repos.d/* wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Ce ...

  2. Redis缓存穿透,缓存击穿,缓存雪崩,热点Key

    导读 使用Redis难免会遇到Redis缓存穿透,缓存击穿,缓存雪崩,热点Key的问题.有些同学可能只是会用Redis来存取,基本都是用项目里封装的工具类来操作.但是作为开发,我们使用Redis时可能 ...

  3. SpringCloud框架

    最近一直在针对SpringCloud框架做项目,从中踩了不少的坑,也渐渐梳理出了一些内容,由于SpringCloud作为一个全家桶,其中东西太多,所以这时候就要有所取舍,这里就想把自己比较常用组件及架 ...

  4. maven 学习---Maven 插件

    什么是 Maven 插件? Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成.Maven 插件通常被用来: 创建 jar 文件 创建 war 文件 编译代码文件 代码单元测试 创 ...

  5. 二、HDFS(架构、读写、NN)

    一.HDFS定义 HDFS (Hadooop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件:其次,它是分布式的,由很多服务器联合走来实现其功能 ...

  6. Gradle 创建java程序详细步骤

    Java构建工具三强: Ant, Maven, GradleAnt历史悠久, 用build.xml 描述, 当时他的xml着实让很多工程师头痛, 但仍有用武之地. Maven 用pom.xml 文件描 ...

  7. Centos7部署分布式文件存储(Fastdfs)

    目录 FastDFS介绍 楼主目标:前可H5撩妹,后可Linux搞运维 环境:Centos7 软件: 软件链接: 安装前所有准备,上传软件到Centos7上的/opt的目录下 安装依赖软件和类库(安装 ...

  8. linux 通过wol远程开机【转】

    转自:http://yangbajing.blog.chinaunix.net/uid-10480699-id-5179860.html 今天发现个可以对linux服务器进行远程开机的软件-wakeo ...

  9. 渗透技巧——Windows系统的帐户隐藏

    渗透技巧——Windows系统的帐户隐藏 2017-11-28-00:08:55  0x01 帐户隐藏的方法 该方法在网上已有相关资料,本节只做简单复现 测试系统:·Win7 x86/WinXP 1. ...

  10. K8s集群中设置harbor仓库认证

    一,获取harbor的登陆用户名和密码(demo_user/demo_pwd) 二,使用kubectl命令生成secret(不同的namespace要分别生成secret,不共用) kubectl c ...