客户端 WebSocket详细用法

前言

WebSocket是一种网络通信协议,很多高级功能都需要用到它。

有些人会想,既然我们已经有了HTTP协议了,为什么还要花时间学另一种协议呢?这个协议到底有什么魔力,值得我们花时间学它。

因为 HTTP 协议有一个缺陷:通信只能由客户端发起。只能是客户端向服务器发出请求,服务器返回查询结果。做不到服务器主动向客户端推送信息。如果碰到一些需要服务端频繁给客户端推送信息的需求,我们用HTTP协议来实现就很麻烦。隔一段时间客户端就发起询问,了解服务器有没有新的信息。这种需求典型的例子就是聊天室,需要不断更新聊天室的内容。

轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。

简介

WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。WebSocket 允许服务器端与客户端进行全双工(full-duplex)的通信。举例来说,HTTP 协议有点像发电子邮件,发出后必须等待对方回信;WebSocket 则是像打电话,服务器端和客户端可以同时向对方发送数据,它们之间存着一条持续打开的数据通道。

WebSocket还有其他特点,如下:

  1. 建立在 TCP 协议之上,服务器端的实现比较容易。
  2. 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
  3. 可以发送文本,也可以发送二进制数据。
  4. 没有同源限制,客户端可以与任意服务器通信,完全可以取代 Ajax。
  5. 数据格式比较轻量,性能开销小,通信高效。
  6. 协议标识符是ws(如果加密,则为wss,对应 HTTPS 协议),服务器网址就是 URL。

WebSocket握手

浏览器发出的 WebSocket 握手请求类似于下面的样子:

GET / HTTP/1.1
Connection: Upgrade
Upgrade: websocket
Host: example.com
Origin: null
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

上面的头信息之中,有一个 HTTP 头是Upgrade。HTTP1.1 协议规定,Upgrade字段表示将通信协议从HTTP/1.1转向该字段指定的协议。Connection字段表示浏览器通知服务器,如果可以的话,就升级到 WebSocket 协议。Origin字段用于提供请求发出的域名,供服务器验证是否许可的范围内(服务器也可以不验证)。Sec-WebSocket-Key则是用于握手协议的密钥,是 Base64 编码的16字节随机字符串。
服务器的 WebSocket 回应如下。

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://example.com/

上面代码中,服务器同样用Connection字段通知浏览器,需要改变协议。Sec-WebSocket-Accept字段是服务器在浏览器提供的Sec-WebSocket-Key字符串后面,添加 RFC6456 标准规定的“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”字符串,然后再取 SHA-1 的哈希值。浏览器将对这个值进行验证,以证明确实是目标服务器回应了 WebSocket 请求。Sec-WebSocket-Location字段表示进行通信的 WebSocket 网址。

完成握手以后,WebSocket 协议就在 TCP 协议之上,开始传送数据。

客户端使用WebSocket的简单示例

WebSocket的使用方式很简单,如下就是客户端的简单使用示例:

const socket  = new WebSocket("ws://localhost:8080");

socket.addEventListener('open',(evt)=>{
   
  console
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebSocket客户端和服务端实例源码 WebSocket ws实例 HTML5 用java实现的服务端 Websocket与服务器的正常通信 众所周知,Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端客户端浏览器将信息呈现,这种机制对于信息变化不是特别频繁的应用尚可,但对于实时要求高、海量并发的应用来说显得捉襟见肘,尤其在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是 Web 应用经常面临的问题,比如金融证券的实时信息,Web 导航应用中的地理位置获取,社交网络的实时消息推送等。 传统的请求-响应模式的 Web 开发在处理此类业务场景时,通常采用实时通讯方案,常见的是: 轮询,原理简单易懂,就是客户端通过一定的时间间隔以频繁请求的方式向服务器发送请求,来保持客户端和服务器端的数据同步。问题很明显,当客户端以固定频率向服务器端发送请求时,服务器端的数据可能并没有更新,带来很多无谓请求,浪费带宽,效率低下。 基于 Flash,AdobeFlash 通过自己的 Socket 实现完成数据交换,再利用 Flash 暴露出相应的接口为 JavaScript 调用,从而达到实时传输目的。此方式比轮询要高效,且因为 Flash 安装率高,应用场景比较广泛,但在移动互联网终端上 Flash 的支持并不好。IOS 系统中没有 Flash 的存在,在 Android 中虽然有 Flash 的支持,但实际的使用效果差强人意,且对移动设备的硬件配置要求较高。2012 年 Adobe 官方宣布不再支持 Android4.1+系统,宣告了 Flash 在移动终端上的死亡。 从上文可以看出,传统 Web 模式在处理高并发及实时性需求的时候,会遇到难以逾越的瓶颈,我们需要一种高效节能的双向通信机制来保证数据的实时传输。在此背景下,基于 HTML5 规范的、有 Web TCP 之称的 WebSocket 应运而生。 早期 HTML5 并没有形成业界统一的规范,各个浏览器和应用服务器厂商有着各异的类似实现,如 IBM 的 MQTT,Comet 开源框架等,直到 2014 年,HTML5 在 IBM、微软、Google 等巨头的推动和协作下终于尘埃落地,正式从草案落实为实际标准规范,各个应用服务器及浏览器厂商逐步开始统一,在 JavaEE7 中也实现了 WebSocket 协议,从而无论是客户端还是服务端的 WebSocket 都已完备,读者可以查阅HTML5 规范,熟悉新的 HTML 协议规范及 WebSocket 支持。
### 回答1: Q: 'new websocket(url)' 是什么意思? A: 在 JavaScript 中,'new Websocket(url)' 是创建一个基于 WebSocket 协议的客户端连接,并传递连接的目标 URL 作为参数。 ### 回答2: `new WebSocket(url)` 是用于在客户端创建 WebSocket 对象的语法。 WebSocket 是一种在客户端和服务器之间进行双向通信的技术。它通过在客户端和服务器之间建立持久的连接,实现了更高效的实时通信。与传统的 HTTP 请求相比,WebSocket 提供了更低的延迟和更高的效率。 在 JavaScript 中,可以使用 `new WebSocket(url)` 方法来创建一个 WebSocket 对象,其中 `url` 参数指定了要连接的服务器的地址。这个地址可以是一个相对 URL 或绝对 URL。 在创建 WebSocket 对象之后,浏览器会自动尝试与服务器建立连接。当连接建立成功后,客户端和服务器之间就可以通过发送消息进行实时通信了。客户端可以通过 `send(data)` 方法发送消息给服务器,服务器可以通过 `onmessage` 事件监听客户端发送的消息,并对其进行处理。 另外,WebSocket 还提供了一些其他的事件和方法,用于监听连接的状态和进行相应的操作。比如 `onopen` 事件用于在连接建立成功后执行相应的操作,`onerror` 事件用于在连接出现错误时执行相应的操作,`onclose` 事件用于在连接关闭后执行相应的操作等。 总之,`new WebSocket(url)` 是用于在客户端创建 WebSocket 对象的方法,它可以实现更高效的实时通信,提供了一系列的事件和方法用于进行相关操作。 ### 回答3: new websocket(url) 是用来创建一个新的 WebSocket 对象。 WebSocket 是一种在客户端和服务器之间进行全双工通信的协议,它允许实时的数据传输。它建立在单一的 TCP 连接上,通过不同的协议进行数据交互,并且可以在客户端和服务器之间进行双向的通信。 在 JavaScript 中,通过使用 new WebSocket(url) 来创建一个 WebSocket 对象。其中的 url 参数表示要连接的 WebSocket 服务器的 URL。这个 URL 可以是包含协议、主机名、端口号和可选路径的字符串,例如:ws://example.com/mywebsocket。 创建 WebSocket 对象后,可以使用其提供的方法和事件来进行通信。WebSocket 对象有以下几个常用的方法: - websocket.send(data) 用于向服务器发送数据。 - websocket.close() 用于关闭 WebSocket 连接。 WebSocket 对象也具有一些常见的事件,用于处理 WebSocket 的状态和收发数据,例如: - onopen 事件在 WebSocket 连接建立成功时触发。 - onmessage 事件在收到来自服务器的消息时触发。 - onclose 事件在 WebSocket 连接被关闭时触发。 - onerror 事件在发生错误时触发。 使用 WebSocket 对象可以实现实时的数据交互,例如实时聊天、实时更新数据等。在创建 WebSocket 对象时,需要确保提供的 URL 是准确可用的,并且需要相应的服务器端支持 WebSocket 协议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值