WebSocketsWCPHTML5中文学习网 - HTML5先行者学习网
Web Sockets 是用于 Web 应用程序的新一代双向通信技术,运行在单一套接字之上,它通过 JavaScript 接口暴漏在 HTML5 兼容的浏览器中。WCPHTML5中文学习网 - HTML5先行者学习网
一旦取得 Web 服务器上的 Web Socket 连接之后,就可以通过调用 send() 方法从浏览器发送数据到服务器上,通过 onmessage 事件处理程序从服务器接收数据到浏览器中。WCPHTML5中文学习网 - HTML5先行者学习网
下面是创建一个新的 WebSocket 对象的 API。WCPHTML5中文学习网 - HTML5先行者学习网
JavaScript Code复制内容到剪贴板
    - var Socket = new WebSocket(url, [protocal] );  
 
第一个参数 url 用于指定要连接的 URL。第二个属性 - 端口是可选的,如果提供,就会指定一个服务器必须支持连接成功的子协议。WCPHTML5中文学习网 - HTML5先行者学习网
WebSocket 属性WCPHTML5中文学习网 - HTML5先行者学习网
下面是 WebSocket 对象的属性。假定我们已经创建了上述的 Socket 对象:WCPHTML5中文学习网 - HTML5先行者学习网
WCPHTML5中文学习网 - HTML5先行者学习网
                        | 属性  |             描述  |         
                    | Socket.readyState  |                          只读属性readyState表示连接的状态。有以下取值: WCPHTML5中文学习网 - HTML5先行者学习网                             -                 
0 表示连接尚未建立。 WCPHTML5中文学习网 - HTML5先行者学习网                                  -                 
1 表示连接已建立,可以进行通信。 WCPHTML5中文学习网 - HTML5先行者学习网                                  -                 
2 表示连接正在进行关闭握手。 WCPHTML5中文学习网 - HTML5先行者学习网                                  -                 
3 表示连接已经关闭或者连接不能打开。 WCPHTML5中文学习网 - HTML5先行者学习网                                            |         
                    | Socket.bufferedAmount  |                          只读属性bufferedAmount表示已经使用 send() 方法排队的 URF-8 文本字节数。 WCPHTML5中文学习网 - HTML5先行者学习网              |         
    
WCPHTML5中文学习网 - HTML5先行者学习网WebSocket 事件WCPHTML5中文学习网 - HTML5先行者学习网
下面是 WebSocket 对象相关的事件。假定我们已经创建了上述的 Socket 对象:
WCPHTML5中文学习网 - HTML5先行者学习网                        | 事件  |             事件处理程序  |             描述  |         
                    | open  |             Socket.onopen  |             建立 socket 连接时触发这个事件。  |         
                    | message  |             Socket.onmessage  |             客户端从服务器接收数据时触发。  |         
                    | error  |             Socket.onerror  |             连接发生错误时触发。  |         
                    | close  |             Socket.onclose  |             连接被关闭时触发。  |         
    
WCPHTML5中文学习网 - HTML5先行者学习网WebSocket 方法WCPHTML5中文学习网 - HTML5先行者学习网
下面是 WebSocket 对象相关的方法。假定我们已经创建了上述的 Socket 对象:
WCPHTML5中文学习网 - HTML5先行者学习网                        | 方法  |             描述  |         
                    | Socket.send()  |                          send(data) 方法使用连接传输数据。 WCPHTML5中文学习网 - HTML5先行者学习网              |         
                    | Socket.close()  |                          close() 方法用于终止任何现有连接。 WCPHTML5中文学习网 - HTML5先行者学习网              |         
    
WCPHTML5中文学习网 - HTML5先行者学习网
服务器推送事件WCPHTML5中文学习网 - HTML5先行者学习网
传统的 Web 应用程序生成发送到 Web 服务器端的事件。比如,点击一个链接会从服务器请求一个新页面。WCPHTML5中文学习网 - HTML5先行者学习网
这种从 Web 浏览器到 Web 服务器的时间类型可以称作客服端事件。WCPHTML5中文学习网 - HTML5先行者学习网
随着 HTML5 的出现,WHATWG Web Applications 1.0 引入了一个从 Web 服务器到 Web 浏览器的事件流,被称作服务器推送事件(SSE)。使用 SSE 可以不停的将 DOM 事件推送到用户的浏览器中。WCPHTML5中文学习网 - HTML5先行者学习网
这个事件流方法会打开一个到服务器的持久连接,新消息可用时发送数据到客户端,从而不再需要持续的轮询。WCPHTML5中文学习网 - HTML5先行者学习网
SSE Web 应用程序WCPHTML5中文学习网 - HTML5先行者学习网
要在 Web 应用程序中使用服务器推送事件,我们需要给文档添加一个 <eventsource>元素。WCPHTML5中文学习网 - HTML5先行者学习网
<eventsource> 元素的 src 属性应该指向一个 URL,这个 URL 应该提供一个 HTTP 持久连接用于发送包含事件的数据流。WCPHTML5中文学习网 - HTML5先行者学习网
这个 URL 将会指向一个持续发送事件数据的 PHP,PERL 或者任意 Python 脚本。下面是一个简单的期望获得服务器时间的 Web 应用程序示例。WCPHTML5中文学习网 - HTML5先行者学习网
XML/HTML Code复制内容到剪贴板
    - <!DOCTYPE HTML>  
     - <html>  
     - <head>  
     - <script type="text/javascript">  
     - /* Define event handling logic here */   
     - </script>  
     - </head>  
     - <body>  
     - <div id="sse">  
     -    <eventsource src="/cgi-bin/ticker.cgi" />  
     - </div>  
     - <div id="ticker">  
     -    <TIME>  
     - </div>  
     - </body>  
     - </html>  
 
SSE 服务器端脚本WCPHTML5中文学习网 - HTML5先行者学习网
服务器端脚本应该发送 Content-type 头指定类型为 text/event-stream,如下所示:WCPHTML5中文学习网 - HTML5先行者学习网
print "Content-Type: text/event-stream/n/n";
WCPHTML5中文学习网 - HTML5先行者学习网设置 Content-type 之后,服务器端脚本将发送一个后面紧跟事件名称的 Event: 标签。下面的示例将会发送一个以换行符结束的 Server-Time 作为事件名称。
WCPHTML5中文学习网 - HTML5先行者学习网
print "Event: server-time/n";
WCPHTML5中文学习网 - HTML5先行者学习网最后一步是使用 Data: 标签发送事件数据,紧随其后的是以换行符结束的整数字符串值,如下所示:
WCPHTML5中文学习网 - HTML5先行者学习网
$time = localtime();WCPHTML5中文学习网 - HTML5先行者学习网
print "Data: $time/n";
WCPHTML5中文学习网 - HTML5先行者学习网下面是用 perl 编写的完整 ticker.cgi:
WCPHTML5中文学习网 - HTML5先行者学习网
WCPHTML5中文学习网 - HTML5先行者学习网
#!/usr/bin/perlWCPHTML5中文学习网 - HTML5先行者学习网
print "Content-Type: text/event-stream/n/n";WCPHTML5中文学习网 - HTML5先行者学习网
while(true){WCPHTML5中文学习网 - HTML5先行者学习网
   print "Event: server-time/n";WCPHTML5中文学习网 - HTML5先行者学习网
   $time = localtime();WCPHTML5中文学习网 - HTML5先行者学习网
   print "Data: $time/n";WCPHTML5中文学习网 - HTML5先行者学习网
   sleep(5);WCPHTML5中文学习网 - HTML5先行者学习网
WCPHTML5中文学习网 - HTML5先行者学习网WCPHTML5中文学习网 - HTML5先行者学习网
处理服务器推送事件WCPHTML5中文学习网 - HTML5先行者学习网
让我们修改一下我们的 Web 应用程序来处理服务器推送时间。下面是最终示例:WCPHTML5中文学习网 - HTML5先行者学习网
XML/HTML Code复制内容到剪贴板
    - <!DOCTYPE HTML>  
     - <html>  
     - <head>  
     - <script type="text/javascript">  
     -    document.getElementsByTagName("eventsource")[0].   
     -             addEventListener("server-time", eventHandler, false);   
     -    function eventHandler(event)   
     -    {   
     -        // Alert time sent by the server   
     -        document.querySelector('#ticker').innerHTML = event.data;   
     -   
     -    }   
     - </script>  
     - </head>  
     - <body>  
     - <div id="sse">  
     -    <eventsource src="/cgi-bin/ticker.cgi" />  
     - </div>  
     - <div id="ticker" name="ticker">  
     -    [TIME]   
     - </div>  
     - </body>  
     - </html>  
 
在测试服务器推送事件之前,建议你确保你的 Web 浏览器支持这一概念。WCPHTML5中文学习网 - HTML5先行者学习网