Web Sockets的目标是在一个单独的持久连接上提供全双工、双向通信。在Javascript中创建了Web Sockets之后,会有一个HTTP请求发送到浏览器以发起连接。在取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为Web Socket协议。也就是说,使用标准的HTTP服务器无法实现Web Sockets,只有支持这种协议的专门服务器才能正常工作。

由于Web Sockets使用了自定义的协议,所以URL模式也略有不同。未加密的连接不再是http://,而是ws://;加密的连接也不是https://,而是wss://。在使用Web Sockets URL时,必须带着这个模式,因为将来还有可能支持其他模式。

使用自定义协议而非HTTP协议的好处

  能够在客户端和服务器之间发送非常少量的数据,而不必担心HTTP那样字节级的开销。由于传递的数据包很小,因此Web Sockets非常适合移动应用。毕竟对移动应用而言,带宽和网络延迟都是关键问题。

自定义协议的缺点

制定协议的时间比制定Javascript API的时间还要长。
存在一致性和安全性问题。

支持Web Sockets的浏览器:Firefox6+、Safari5+、Chrome、iOS4+版的Safari。

(1)Web Sockets API

创建Web Socket,实例一个WebSocket对象并传入要连接的URL:
var socket = new WebSocket("ws://www.example.com/server.php");

注:
必须给WebSocket构造函数传入绝对URL。同源策略对Web Sockets不适用,因此可以通过它打开到任何站点的连接。至于是否会与某个域中的页面通信,则完全取决于服务器。(通过握手信息就可以知道请求来自何方。)

WebSocket表示当前状态的readyState属性:
* WebSocket.OPENING(0):正在建立连接。
* WebSocket.OPEN(1):已经建立连接。
* WebSocket.CLOSING(2):正在关闭连接。
* WebSocket.CLOSE(3):已经关闭连接。

关闭Web Socket连接:
socket.close();

调用了close()之后,readyState的值立即变为2(正在关闭),而在关闭连接后就会变成3。

(2)发送和接收数据

向服务器发送数据,使用send()方法并传入任意字符串:

var socket = new WebSocket("ws://www.example.com/server.php");
socket.send("Hello World!");

因为Web Sockets只能通过连接发送纯文本数据,所以对于复杂的数据结构,在通过连接发送之前,必须序列化。

如:
var message = {
time: new Date(),
text: "Hello World!",
clientId: "asdfp8734req"
};
socket.send(JSON.stringify(message));

当服务器向客户端发送消息是,WebSocket对象就会触发message事件:

socket.onmessage = function(event){
var data = event.data;
//处理数据
//event.data返回的数据也是字符串
};

(3)其他事件

* open:在成功建立连接时触发。
* error:在发生错误时触发,连接不能持续。
* close:在连接关闭时触发。

WebSocket对象不支持DOM2级事件侦听器,必须使用DOM0级语法分别定义每个事件处理程序。

 1 var socket = new WebSocket("ws://www.example.com/server.php");
2 socket.onopen = function(){
3 alert("Connection established.");
4 };
5 socket.onerror = function(){
6 alert("Connection error.");
7 };
8 socket.onclose = function(){
9 alert("Connection closed.");
10 };

只有close事件的event对象有额外的信息。

三个额外属性:
wasClean:布尔值,表示连接是否已经明确的关闭;
code:服务器返回的数值状态码;
reason:一个字符串,包含服务器发回的消息。

可以吧这些信息显示给用户,也可以记录到日志中以便将来分析:

socket.onclose = function(event){
console.log("Was clean?" + event.wasClean + " Code=" + event.code + " Reason=" + event.reason);
};

Javascript Ajax总结——其他跨域技术之Web Sockets的更多相关文章

  1. 06: AJAX全套 & jsonp跨域AJAX

    目录: 1.1 AJAX介绍 1.2 jQuery AJAX(第一种) 1.3 原生ajax(第二种) 1.4 iframe“伪”AJAX(第三种) 1.5 jsonp跨域请求 1.6 在tornad ...

  2. js中ajax如何解决跨域请求

    js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操 ...

  3. ajax请求ashx跨域问题解决办法

    ajax请求ashx跨域问题解决办法 https://blog.csdn.net/windowsliusheng/article/details/51583566 翻译windowsliusheng  ...

  4. javascript跨域请求RESTful Web Service

    跨域请求RESTful Web Service 当我们用js请求RESTful Web Service的时候,通常会出现跨域无法访问的问题,也就是无法正常得到我们要的值.jsonp是个解决问题的方法. ...

  5. 原生JavaScript封装的jsonp跨域请求

    原生JavaScript封装的jsonp跨域请求 <!DOCTYPE html> <html lang="en"> <head> <met ...

  6. JavaScript JSON AJAX 同源策略 跨域请求

    网页和Ajax和跨域的关系 1 Ajax使网页可以动态地.异步地的与服务器进行数据交互,可以让网页局部地与服务器进行数据交互 2 Ajax强调的是异步,但是会碰到跨域的问题. 3 而有很多技术可以解决 ...

  7. AJAX请求和跨域请求详解(原生JS、Jquery)

    一.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = 异步 JavaScript 和 XML,是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数 ...

  8. (转)jquery ajax使用及跨域访问解决办法

    原文地址:***/UIweb/jquery_ajax_kuayujiejue.html 最近开发中,设计到智能手机项目,给领导做几个demo.主要是用jquery和jqeury mobile. 越来越 ...

  9. Ajax【介绍、入门、解决Ajax中文、跨域、缓存】

    什么是Ajax Ajax(Asynchronous JavaScript and XML) 异步JavaScript和XML Ajax实际上是下面这几种技术的融合: (1)XHTML和CSS的基于标准 ...

  10. JavaScript使用jsonp实现跨域

    为什么要把ajax跨域写一下呢,因为ajax跨域并不是想跨就能跨的.因为为了安全,ajax是不允许跨域的. 举个例子,你有一个卖水果的网站,你的ajax请求另一个网站提供的图片,正常的时候,图片是一个 ...

随机推荐

  1. Mysql中文字符串提取datetime

    DATE_FORMAT无法用于提取含中文字符的时间字符串中的时间, 可以通过STR_TO_DATE来提取其中的信息, 如下: SELECT STR_TO_DATE("2018年11月05日 ...

  2. HarmonyOS 4.0 实况窗上线!支付宝实现医疗场景智能提醒

    本文转载自支付宝体验科技,作者是蚂蚁集团客户端工程师博欢,介绍了支付宝如何基于 HarmonyOS 4.0 实况窗实现医疗场景履约智能提醒. 1.话题背景 8 月 4 日,华为在 HDC(华为 202 ...

  3. DBeaver Ultimate 22.1.0 连接数据库(MySQL+Mongo+Clickhouse)

    前言 继续书接上文 Docker Compose V2 安装常用数据库MySQL+Mongo,部署安装好之后我本来是找了一个web端的在线连接数据库的工具,但是使用过程中并不丝滑,最终还是选择了使用 ...

  4. Java-全网最详细数据结构

    数构&算法:数据结构 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率.数据结构往 ...

  5. 以效率为导向:用ChatGPT和HttpRunner实现敏捷自动化测试(二)

    1.前言 在上一篇文章: 利用ChatGPT提升测试工作效率--测试工程师的新利器(一)中,我们提到了如何通过chatGPT生成单接口测试用例,然后再让chatGPT去根据测试用例去生成接口自动化脚本 ...

  6. 算法修养--广度优先搜索BFS

    广度优先算法(BFS) 广度优先算法(Breadth-First Search)是在图和树领域的搜索方法,其核心思想是从一个起始点开始,访问其所有的临近节点,然后再按照相同的方式访问这些临近节点的节点 ...

  7. 【学习】fhq-treap

    fhq-treap 是一种好写.复杂度低,且功能的优秀数据结构,涵盖了 treap 几乎所有的功能,其巧妙之处,就在于运用分离和合并两种操作代替了旋转操作. 1. BST 的定义 (摘自 OI Wik ...

  8. Vue之交互

    1.get() <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  9. form表单调接口校验 比如后台验证用户名是否存在

    <FormItem {...formItemLayout} label={'显示名'}> {getFieldDecorator('displayName', { initialValue: ...

  10. webpack配置打包

    一.webpack基本安装 1.创建webpack项目目录如webpackDemo,并进入webpackDemo; 2. 在node已经安装的前提下,打开命令行控制器,输入如下命令: npm init ...