-
H5开发(四):HTML5 服务器推送事件、WebSockets 教程、画布、音频和视频
adinnet / 2017-08-30 15:44 /网站开发
HTML5 服务器推送事件
传统的 Web 应用程序生成发送到 Web 服务器端的事件。比如,点击一个链接会从服务器请求一个新页面。
这种从 Web 浏览器到 Web 服务器的时间类型可以称作客服端事件。
随着 HTML5 的出现,<a rel="nofollow" href="http://www.whatwg.org/" "="" style="box-sizing: border-box; padding: 0px; margin: 0px; background-color: transparent; color: rgb(45, 133, 202); text-decoration: none;">WHATWG Web Applications 1.0 引入了一个从 Web 服务器到 Web 浏览器的事件流,被称作服务器推送事件(SSE)。使用 SSE 可以不停的将 DOM 事件推送到用户的浏览器中。
这个事件流方法会打开一个到服务器的持久连接,新消息可用时发送数据到客户端,从而不再需要持续的轮询。
SSE Web 应用程序
要在 Web 应用程序中使用服务器推送事件,我们需要给文档添加一个 <eventsource>元素。
<eventsource> 元素的 src 属性应该指向一个 URL,这个 URL 应该提供一个 HTTP 持久连接用于发送包含事件的数据流。
这个 URL 将会指向一个持续发送事件数据的 PHP,PERL 或者任意 Python 脚本。下面是一个简单的期望获得服务器时间的 Web 应用程序示例。
<!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 服务器端脚本
服务器端脚本应该发送 Content-type 头指定类型为 text/event-stream,如下所示:
print "Content-Type: text/event-stream\n\n";
设置 Content-type 之后,服务器端脚本将发送一个后面紧跟事件名称的 Event: 标签。下面的示例将会发送一个以换行符结束的 Server-Time 作为事件名称。
print "Event: server-time\n";
更后一步是使用 Data: 标签发送事件数据,紧随其后的是以换行符结束的整数字符串值,如下所示:
$time = localtime(); print "Data: $time\n";
下面是用 perl 编写的完整 ticker.cgi:
#!/usr/bin/perl print "Content-Type: text/event-stream\n\n"; while(true){ print "Event: server-time\n"; $time = localtime(); print "Data: $time\n"; sleep(5); }
处理服务器推送事件
让我们修改一下我们的 Web 应用程序来处理服务器推送时间。下面是更终示例:
<!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>
HTML5 WebSockets 教程
Web Sockets 是用于 Web 应用程序的新一代双向通信技术,运行在单一套接字之上,它通过 JavaScript 接口暴漏在 HTML5 兼容的浏览器中。
一旦取得 Web 服务器上的 Web Socket 连接之后,就可以通过调用 send() 方法从浏览器发送数据到服务器上,通过onmessage 事件处理程序从服务器接收数据到浏览器中。
下面是创建一个新的 WebSocket 对象的 API。
var Socket = new WebSocket(url, [protocal] );
第一个参数 url 用于指定要连接的 URL。第二个属性 - 端口是可选的,如果提供,就会指定一个服务器必须支持连接成功的子协议。
WebSocket 属性
下面是 WebSocket 对象的属性。假定我们已经创建了上述的 Socket 对象:
属性 描述 Socket.readyState 只读属性readyState表示连接的状态。有以下取值:
0 表示连接尚未建立。
1 表示连接已建立,可以进行通信。
2 表示连接正在进行关闭握手。
3 表示连接已经关闭或者连接不能打开。
Socket.bufferedAmount 只读属性bufferedAmount表示已经使用 send() 方法排队的 URF-8 文本字节数。
WebSocket 事件
下面是 WebSocket 对象相关的事件。假定我们已经创建了上述的 Socket 对象:
事件 事件处理程序 描述 open Socket.onopen 建立 socket 连接时触发这个事件。 message Socket.onmessage 客户端从服务器接收数据时触发。 error Socket.onerror 连接发生错误时触发。 close Socket.onclose 连接被关闭时触发。 WebSocket 方法
下面是 WebSocket 对象相关的方法。假定我们已经创建了上述的 Socket 对象:
方法 描述 Socket.send() send(data) 方法使用连接传输数据。
Socket.close() close() 方法用于终止任何现有连接。
WebSocket 示例
一个 WebSocket 就是客户端和服务端之间的标准双向 TCP 套接字。套接字以 HTTP 连接开始,在 HTTP 握手之后“升级”为 TCP 套接字。握手之后,任意一端都可以发送数据。
客户端 HTML 和 JavaScript 代码
编写这篇教程时,只有少数几个浏览器支持 WebSocket() 接口。你可以使用更新版的 Chrome,Mozilla,Opera 和 Safari 尝试下面这个例子。
<!DOCTYPE HTML> <html> <head> <script type="text/javascript"> function WebSocketTest() { if ("WebSocket" in window) { alert("WebSocket is supported by your Browser!"); // Let us open a web socket var ws = new WebSocket("ws://localhost:9998/echo"); ws.onopen = function() { // Web Socket is connected, send data using send() ws.send("Message to send"); alert("Message is sent..."); }; ws.onmessage = function (evt) { var received_msg = evt.data; alert("Message is received..."); }; ws.onclose = function() { // websocket is closed. alert("Connection is closed..."); }; } else { // The browser doesn't support WebSocket alert("WebSocket NOT supported by your Browser!"); } } </script> </head> <body> <div id="sse"> <a href="javascript:WebSocketTest()">Run WebSocket</a> </div> </body> </html>
安装 pywebsocket
在测试上面的客户端程序之前,需要一个支持 WebSocket 的服务器。可以从 <a rel="nofollow" href="http://code.google.com/p/pywebsocket/" "="" style="box-sizing: border-box; padding: 0px; margin: 0px; background-color: transparent; color: rgb(45, 133, 202); text-decoration: none;">pywebsocket 下载 mod_pywebsocket-x.x.x.tar.gz,它只在为 Apache HTTP 服务器提供 WebSocket 扩展,然后按照如下步骤安装。
解压缩和解压下载的文件
进入 pywebsocket-x.x.x/src/ 目录。
执行 $python setup.py build
执行 $sudo python setup.py install
然后通过 $pydoc mod_pywebsocket 读取文档
这将会把他安装到我们的 python 环境中。
启动服务器
进入 __pywebsocket-x.x.x/src/mod_pywebsocket__ 文件夹并运行如下命令:
$sudo python standalone.py -p 9998 -w ../example/
这会启动监听 9998 端口的服务器,然后使用通过 -w 选项指定的处理程序目录,也就是 echo_wsh.py 所在目录。
现在使用 Chrome 浏览器打开起初创建的 html 文件。如果浏览器支持 WebSocket(),那么会得到一个指示浏览器支持 WebSocket 的消息框,当我们点击 “Run WebSocket” 时会得到服务器脚本发出的 Goodbye 信息。
HTML5 画布
HTML5 <canvas> 元素为我们使用 JavaScript 绘制图形提供了一种简单而又强大的方式。它可以用来绘制图表,制作摄影作品或者做一些简单(以及复杂)的动画。
这里有一个简单的 <canvas> 元素,除了所有核心的 HTML5 属性,比如 id,name 和 class 等等之外,它只有两个特定的属性 width 和 height。
<canvas id="mycanvas" width="100" height="100"></canvas>
使用 _getElementById()__ 方法很容易找到这个 <canvas> 元素,如下所示:
var canvas = document.getElementById("mycanvas");
我们来看一个在 HTML5 文档中使用 <canvas> 元素的简单示例。
<!DOCTYPE HTML> <html> <head> <style> #mycanvas{ border:1px solid red; } </style> </head> <body> <canvas id="mycanvas" width="100" height="100"></canvas> </body> </html>
便于学习上述概念 - 请使用更新版的 Safari 或者 Opera 进行ExplorerCanvas 让 IE 浏览器支持 Canvas。只需按照如下方式引入这个脚本即可:
<!--[if IE]><script src="excanvas.js"></script><![endif]-->
HTML5 Canvas 示例
本教程涵盖下列 HTML5 <canvas> 元素相关的示例。
示例 描述 绘制路径 学习如何在 HTML5 <canvas> 元素中使用路径创建形状。
绘制贝塞尔曲线 学习如何使用 HTML5 <canvas> 元素绘制贝塞尔曲线。、
使用图像 学习如何在 HTML5 <canvas> 元素中使用图像。
样式和颜色 学习如何使用 HTML5 <canvas> 元素应用样式和颜色。
图案和投影 学习如何绘制不同的图案和阴影。
画布平移 这个方法用于移动画布和它原点到网格上的不同点。
画布缩放 这个方法用于增大或者减小画布网格中的单位。
画布合成 这个方法用于从画布上屏蔽某些区域或者清除某一部分。
<a rel="nofollow" href="http://www.tutorialspoint.com/html5/canvas_animation.htm" "="" title="Canvas Animation" style="box-sizing: border-box; padding: 0px; margin: 0px; background-color: transparent; color: rgb(45, 133, 202); text-decoration: none;">Canvas 动画 学习如何使用 HTML5 画布和 JavaScript 创建基本的动画。
HTML5 音频和视频
HTML5 特性,包括原生音频和视频支持而无需 Flash。
HTML5 <audio> 和 <video> 标签让我们给站点添加媒体变得简单。我们只需要设置 src 属性来识别媒体资源,包含 controls 属性让用户可以播放和暂停媒体。
嵌入视频
下面是在 Web 页面中嵌入视频文件更简单的形式:
<video src="foo.mp4" width="300" height="200" controls> Your browser does not support the <video> element. </video>
目前的 HTML5 规范草案还没有指定浏览器应该在 video 标签中支持哪种视频格式。但是更常用的视频格式是:
Ogg:带有 Thedora 视频编码器和 Vorbis 音频编码器的 Ogg 文件。
mpeg4:带有 H.264 视频编码器和 AAC 音频编码器的 MPEG4 文件。
我们可以使用带有媒体类型和其他属性的 <source> 标签指定媒体文件。video 元素允许使用多个 source 元素,浏览器会使用第一个认可的格式:
<!DOCTYPE HTML> <html> <body> <video width="300" height="200" controls autoplay> <source src="/html5/foo.ogg" type="video/ogg" /> <source src="/html5/foo.mp4" type="video/mp4" /> Your browser does not support the <video> element. </video> </body> </html>
便于学习上述概念 - 请使用更新版的 Safari 或 Opera 进行在线练习。
Audio 属性规范
HTML5 audio 标签可以使用多个属性来控制外观,感受以及各种控制功能:
属性 描述 autoplay 如果指定这个布尔值属性,只要没停止加载数据,音频就会立刻自动开始播放。 autobuffer 如果指定这个布尔值属性,即使没有设置自动播放,音频也会自动开始缓冲。 controls 如果指定这个属性,表示允许用户控制音频播放,包括音量控制,快进以及暂停/恢复播放。 loop 如果指定这个布尔值属性,表示允许音频播放结束后自动回放。 preload 这个属性指定加载页面时加载音频并准备就绪。如果指定自动播放则忽略。 src 要嵌入的音频 URL。可选,可以在音频块里面使用 <source> 元素指定要嵌入的音频来替代。 处理媒体事件
HTML5 audio 和 video 标签可以用多个属性利用 JavaScript 控制各种控制功能:
事件 描述 abort 播放中止时生成这个事件。 canplay 足够的数据可用并且媒体可以播放时生成这个事件。 ended 播放完成时生成这个事件。 error 发生错误时生成这个事件。 loadeddata 媒体第一帧载入完成时生成这个事件。 loadstart 开始加载媒体时生成这个事件。 pause 播放暂停时生成这个事件。 play 播放开始或者恢复时生成这个事件。 progress 定期通知媒体下载进度时生成这个事件。 ratechange 播放速度改变时生成这个事件。 seeked 快进操作完成时生成这个事件。 seeking 快进操作开始时生成这个事件。 suspend 媒体加载被暂停时生成这个事件。 volumechange 音频音量变化时生成这个事件。 waiting 请求操作(比如播放)被延迟,等待另一个操作完成(比如快进)时生成这个事件。 下面是一个允许播放给定视频的示例:
<!DOCTYPE HTML> <head> <script type="text/javascript"> function PlayVideo(){ var v = document.getElementsByTagName("video")[0]; v.play(); } </script> </head> <html> <body> <form> <video width="300" height="200" src="/html5/foo.mp4"> Your browser does not support the <video> element. </video> <input type="button" onclick="PlayVideo();" value="Play"/> </form> </body> </html>
便于学习上述概念 - 请使用更新版的 Safari 或 Opera 进行<a rel="nofollow" href="http://www.tutorialspoint.com/cgi-bin/practice.cgi?file=html5-51.htm" "="" style="box-sizing: border-box; padding: 0px; margin: 0px; background-color: transparent; color: rgb(45, 133, 202); text-decoration: none;">在线练习。
配置服务器媒体类型
大多数服务器默认都没使用正确的 MIME 类型提供 Ogg 或 mp4 媒体,因此我们可能需要添加适当的配置。
AddType audio/ogg .oga AddType audio/wav .wav AddType video/ogg .ogv .ogg AddType video/mp4 .mp4
- 热门文章