html5中文学习网

您的位置: 首页 > html5教程 > 高级应用 » 正文

浅析HTML5的WebSocket与服务器推送事件_html5教程技巧

[ ] 已经帮助:人解决问题

WebSocketsWCPHTML5中文学习网 - HTML5先行者学习网

Web Sockets 是用于 Web 应用程序的新一代双向通信技术,运行在单一套接字之上,它通过 JavaScript 接口暴漏在 HTML5 兼容的浏览器中。WCPHTML5中文学习网 - HTML5先行者学习网

一旦取得 Web 服务器上的 Web Socket 连接之后,就可以通过调用 send() 方法从浏览器发送数据到服务器上,通过 onmessage 事件处理程序从服务器接收数据到浏览器中。WCPHTML5中文学习网 - HTML5先行者学习网

下面是创建一个新的 WebSocket 对象的 API。WCPHTML5中文学习网 - HTML5先行者学习网

JavaScript Code复制内容到剪贴板
  1. var Socket = new WebSocket(url, [protocal] );  

第一个参数 url 用于指定要连接的 URL。第二个属性 - 端口是可选的,如果提供,就会指定一个服务器必须支持连接成功的子协议。WCPHTML5中文学习网 - HTML5先行者学习网

WebSocket 属性WCPHTML5中文学习网 - HTML5先行者学习网
下面是 WebSocket 对象的属性。假定我们已经创建了上述的 Socket 对象:WCPHTML5中文学习网 - HTML5先行者学习网
WCPHTML5中文学习网 - HTML5先行者学习网

属性 描述
Socket.readyState

只读属性readyState表示连接的状态。有以下取值: WCPHTML5中文学习网 - HTML5先行者学习网

  1. 0 表示连接尚未建立。 WCPHTML5中文学习网 - HTML5先行者学习网

  2. 1 表示连接已建立,可以进行通信。 WCPHTML5中文学习网 - HTML5先行者学习网

  3. 2 表示连接正在进行关闭握手。 WCPHTML5中文学习网 - HTML5先行者学习网

  4. 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复制内容到剪贴板
  1. <!DOCTYPE HTML>  
  2. <html>  
  3. <head>  
  4. <script type="text/javascript">  
  5. /* Define event handling logic here */   
  6. </script>  
  7. </head>  
  8. <body>  
  9. <div id="sse">  
  10.    <eventsource src="/cgi-bin/ticker.cgi" />  
  11. </div>  
  12. <div id="ticker">  
  13.    <TIME>  
  14. </div>  
  15. </body>  
  16. </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复制内容到剪贴板
  1. <!DOCTYPE HTML>  
  2. <html>  
  3. <head>  
  4. <script type="text/javascript">  
  5.    document.getElementsByTagName("eventsource")[0].   
  6.             addEventListener("server-time", eventHandler, false);   
  7.    function eventHandler(event)   
  8.    {   
  9.        // Alert time sent by the server   
  10.        document.querySelector('#ticker').innerHTML = event.data;   
  11.   
  12.    }   
  13. </script>  
  14. </head>  
  15. <body>  
  16. <div id="sse">  
  17.    <eventsource src="/cgi-bin/ticker.cgi" />  
  18. </div>  
  19. <div id="ticker" name="ticker">  
  20.    [TIME]   
  21. </div>  
  22. </body>  
  23. </html>  

在测试服务器推送事件之前,建议你确保你的 Web 浏览器支持这一概念。WCPHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助