了解WebSocket及使用

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

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

 

HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

 

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

 

优点:传递的数据包很小,非常适合移动应用。

API

创建

要创建Web socket,先实例一个WebSocket对象,并传入要连接的URL:

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

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

事件及状态值

实例化了WebSocket对象后,浏览器会马上创建连接。与xhr类似,WebSocket也有一个表示当前状态的readyState属性。但是这个属性与xhr不同:如下:

  • WebSocket.OPENING (0):正在建立连接
  • WebSocket.OPEN  (1) :已经建立连接
  • WebSocket.CLOSING  (2) :正在关闭连接
  • WebSocket.CLOSE (3) :已经关闭连接

WebSocket没有readystatechange事件,不过,它有其他事件,对应着不同的状态。readyState的值永远从0开始。

关闭

关闭Web Socket连接,可以在任何时候调用close()方法。

socket.close();

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

发送和接收数据

Web Socke打开之后,可以通过连接发送和接收数据。要向服务器发送数据,使用send()方法,并传入任意字符串,例如:

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

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

下面展示先将数据序列化为一个JSON字符串,然后再发送到服务器:

var message = {
    time: new Date(),
    text: "Hello World!",
    clientId: "asdfp8734rew"
}

socket.send(JSON.stringify(message));

服务器要通过读取其中的数据,就要解析接收到的JSON字符串。

当服务器向客户端发来消息时,WebSocket对象就会触发message事件。这个message事件与其他传递消息的协议类似,也是把返回的数据保存在event.data属性中。

socket.onmessage = function(event){
    var data = event.data;
    // 处理数据
}

其他事件

WebSocket对象还有其他三个事件,在连接生命周期的不同阶段触发。

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

WebSocket不支持DOM2级事件侦听器。因此需要使用DOM0级语法分别定义每个事件处理程序。

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

socket.onopen = function(){
    console.log("Connection established");
}

socket.onerror = function(){
    console.log("Connection error.");
}

socket.onclose = function(){
    console.log("Connection closed");
}

在三个事件中,只有close事件的event对象有额外信息。这个事件的事件对象有三个额外的属性:wasClean, code , reason。

其中wasClean是一个布尔值,表示连接是否已经明确地关闭;code是服务器返回的数值状态码;reason是一个字符串,包含服务器发回的消息,可以把信息显示给用户,也可以记录到日志中进行分析。

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

 

大体是根据高程查看得到,WebSocket还需要深入学习,使用及原理学习等

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值