websocket

2018-09-29  本文已影响0人  小小的白菜

摘自论道《HTML5》

WebSocket不是标准Socket协议,它在OSI七层模型中处于上层,基于HTTPHTTP协议是TCP协议的一部分。

请求和响应的消息首部

下面给出WebSocket请求和响应的消息首部。客户端到服务端的请求代码如下:

From client to server:
GET /demo HTTP/1.1
Host: example.com
Connection: Upgrade
Sec-WebSocket-Key2: 12998 5 Y3 1 .P00
Sec-WebSocket-Protocol: sample
Upgrade: WebSocket
Sec-WebSocket-Key1: 4@1 46546xW%0l 1 5
Origin: HTTP://example.com
[8-byte security key]

服务端到客户端的响应代码如下:

From server to client:
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: HTTP://example.com
WebSocket-Location: ws://example.com/demo
WebSocket-Protocol: sample
[16-byte hash response]
WebSocket 检测浏览器支持代码
<html>
<div id=support></div>
<script type="text/javascript">
if(window.WebSocket){
    document.getElementById("support").innerHTML = "您的浏览器支持HTML5的WebSocket协议";
}
else{
    document.getElementById("support").innerHTML = "您的浏览器不支持HTML5的WebSocket协议";
}
</script>
</html>

WebSocket API 的内容

属性

WebSocket有两个属性,分别是 readyStatebufferedAmount,其中bufferedAmount是作为连接缓冲用的,而WebSocket服务的 readyState 一共有以下4种状态。

任何一个连接开始的时候,其状态都必须是CONNECTING=0 。如果 ready-State一直是CONNECTING状态,就会报出 INVALID_STATE_ERR异常。

URL

URL属性都是一样的,哪怕是访问同源网站(这里的URL地址必须是绝对地址)。

var Socket = new WebSocket('ws://www.test.com/');

以下三种形式都是错误的:

var Socket = new WebSocket('/');
var Socket = new WebSocket('C:\www.test.com');
var Socket = new WebSocket('http://www.test.com');

以下两种形式都是允许的、正确的:

var Socket = new WebSocket('ws://www.test.com/updates');
var Socket = new WebSocket('ws://www.test.com/updates:8080');
事件

其中 send()方法基于成功的连接传送数据,其参数必须是字符串
string)格式。

事件句柄 事件类型 解 释
onopen open 连接打开
onmessage message 用于接受从服务器传来的信息
onerror error 当出现连接中的各种错误时,用于容错处理和排查
onclose close 连接关闭或断开
send send 基于成功的连接传送数据

在下面这个简单的例子中,bufferedAmount属性用于确保能够保持在每50ms一次更新的频率(如果网络能保持这个速率),如果这个速率太快,那么采用其他能够有保证的速率也可以。

var Socket = new WebSocket('ws://www.test.com:12010/updates');
Socket.onopen = function(){
    setInterval(function(){
        if(Socket.bufferedAmount == 0)
            Socket.send(getUpdateData());
  }, 50);
};
客户端样例程序
<script type="text/javascript">
  //创建一个ws实例
  var ws= new WebSocket('ws://www.xiuyetang.com:25000');
  //打开WebSocket
  ws.onopen = function(event){
    //发送一个初始化消息
    ws.send('向服务器发送一个消息');
    //监听消息
    ws.onmessage = function(event){
      console.log('客户端收到消息,内容如下:'+event.data);
    };
    //监听ws的关闭
    ws.onclose = function(event){
      console.log('连接已经关闭');
    };
    //关闭ws连接
    socket.close();
  };
</script>
服务器端样例程序
  var sys = require("sys");
  var ws = require("websocket"); //此处是WebSocket服务器被调用
  var server = ws.createServer(); //创建WebSocket服务器
  server.addListener("connection", function(conn){ //当有客户端接入时
    conn.send("Connection: "+conn.id); //向接入的客户端发送信息
    conn.addListener("message", function(message){
      //当收到客户端发送的信息时
      server.broadcast("<"+conn.id+">"+message);
      //向所有客户端发送信息
    });
  });
  server.addListener("close", function(conn){ //当有客户端断开连接时
    server.broadcast("Disconnected:"+conn.id); //向所有客户端发送信息
  });
  server.listen(25000); //启动服务,监听25000端口
上一篇 下一篇

猜你喜欢

热点阅读