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先行者学习网