HTML5 WebSocket权威指南.docx
《HTML5 WebSocket权威指南.docx》由会员分享,可在线阅读,更多相关《HTML5 WebSocket权威指南.docx(194页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、HTML5 Web Socket权威指南代码清单12服务器对客户端响应的 1.1首标 /l.x 200 OK X-Powered-By: Servlet/2.5 Server: Sun Java System Application Server 9.1_02 Content-Type: text/html;charset=UTF-8 Content-Length: 321 Date: Wed, 06 Dec 2012 00:32:46 GMT在代码清单1-1和代码清单1-2中,仅仅首标信息的开销就有871字节(这还没有实际 的数据)。这两个例子说明,不管服务器是否向客户端发送实际的数据或者信
2、息,请求的 首标信息都必须在两个方向上传输:从客户端到服务器和从服务器到客户端。在 /1.0和 /1.1中,低效的根源主要是: 用于文档共享,而不是丰富的交互性应用程序,我们在桌面上习以为常的这种应用 程序现在已经进入Web;随着客户端和服务器之间交互的增加, 协议在客户端和 服务器之间通信所需要的信息量快速增加。从根本上讲, 还是半双工的协议,也就是说,在同一时刻流量只能单向流动:客户 端向服务器发送请求(单向),然后服务器响应请求(单向)。半双工的效率很低。想象 一下这样的 交谈:当你想要交流时,你必须按下一个按钮,说话,再按下另一个按钮 完成。同时,你的通话对象必须耐心等待你讲完,按下按
3、钮,最后回复。是不是很熟悉? 我们儿时小规模地进行过这种形式的通信,美国军队始终采用这种方式:步话机。虽然步 话机有绝对的好处和很好的应用,但是并不总是最有效的通信形式。工程师们多年来一直致力于解决这个问题,他们使用各种著名的方法:轮询、长轮询和 流化(streaming)。1.3.2绕道而行: 轮询、长轮询和流化通常,浏览器访问网页时,会向页面所在的服务器发送一个 请求。Web服务器确 认请求并向浏览器发回响应。在许多情况下,返回的信息(如股价、新闻、交通图、医疗息(heartbeat message)。成功创立STOMP连接之后,演示应用程序订阅stompDemo 队列。现在,翻开第二个浏
4、览器窗口(你可以在同一个浏览器中翻开新窗口,或者启动另一个浏 览器),并提供上面使用的同一个连接数据。这时,你可以开始在浏览器窗口之间发送消 息。5.4构建STOMP/WS应用程序我们已经观察了一个简单的STOMP/WS应用程序的演示,现在来尝试构建一个。这里, 我们将尝试构建一个应用程序,使用户能够玩一个流行的游戏一石头剪刀布(也叫 “roshambo”)。如果你不熟悉这个游戏,维基百科提供了丰富的相关信息: :/en.wikipedia.org/wiki/Rock-paper-scissorSo5.4.1 游戏流程我们先来评估一下游戏的需求和流程。这个游戏的传统玩法要求参与者同时出拳(石头
5、、 布或者剪刀)。为此,游戏首先有一个“同步阶段”,此后玩家喊出自己的出拳。在浏览器中玩这个游戏的妙处在于,用户可以远程参与,这也就意味着“同步阶段”的工作 原理略有不同。为了简化在线条件下的同步阶段,我们代之以隐藏玩家的选择,直到两个 玩家都选好出拳方式。下面是基于浏览器的游戏在两个玩家之间的工作方式概览。1)玩家1 (先出拳的玩家)选择一个选项(石头、布或者剪刀)。玩家1的应用显示选 择。2)玩家2 (出拳较慢的玩家)的应用接收到玩家1的出拳(但是不显示玩家1的选择) 并提示玩家1已经做出选择。3)玩家2选择出拳(石头、布或者剪刀)。4)玩家1的应用接收并显示玩家2的选择。5)玩家2的应用
6、显示玩家1和玩家2的选择。构建这个应用程序的难点在于我们能否在浏览器中使其正确运行,又不使用任何后端代码 或者逻辑运行。如何做到这一点?当然是利用消息传递和WebSocket。首先,我们必须考虑应用的通信方式。出于演示的目的,我们将经历这个两人游戏的构建 过程,在这个游戏中两个应用直接通信。你可以回忆图5-2中的说明,我们可以使用队列 (将消息发送给单个消费者)而不是主题(将消息发送给多个消费者)。为了实现我们的目标,并且保持应用程序简单,我们用两个队列构建这个应用,玩家1 的应用向一个队列发布消息,玩家2的应用消费来自同一个队列的消息、。玩家2的应用 也能够向第2个队列发布消息,玩家1的应用
7、消费来自第2个队列的消息。两个队列用游戏开始时我们要求输入的玩家名称识别。根据这些需求,我们先来看看玩家与应用的交互。当应用启动时,它等待玩家输入姓名, 如图5-7所示。Rock Paper Scissors - a Wc xRock Paper Scissors - a Wefile:/localhost/Users/pmoskovi.图5-7在两个并排的浏览器窗口中运行“石头剪刀布”应用程序玩家输入姓名并点击Go按钮,如图5.8所示。Peter。 j file:/localhost/Users/pmoskovi. VanessaRock Paper Scissors - a WeJ fil
8、e:/localhost/Users/pmoskovi. VanessaRock Papr Scissors - a We xPeterGoSelect one:Rock I Paper ScissorsSelect one:Rock I Paper | Scissors图5-8用户在“石头剪刀布应用程序中输入姓名玩家1 (Peter)做出选择。这个选择反映在界面上,如图5-9所示。在玩家2 (Vanessa)的屏幕上显示一条消息,告诉玩家对手已经做出了选择:你的对手正在等待,请出拳!玩家2做出选择之后,结果立刻在两个玩家处显示,如图510所示。C file:/localhost/Users/
9、pmoskovi. Rock Paper Scissors - a WeRock Paper Scissors - a Wc xC file:/localhost/Users/pmoskovi. PeterVanessaI GoPeterVanessaI GoVanessaPeterWaiting for opponent.Waiting for opponent.Your opponent is waiting for you. Make your move!RockPaperScissors图59玩家1出拳 file:/localhost/Users/pmoskovi. VanessaPe
10、terResults:PaperPaper |ScissorsScissorsRock Paper Scissors - a We xRock Paper Scissors - a We2 file:/localhost/Users/pmoskovi. VanessaResults:PeterI Rock jRockScissorsPaper Scissors图5-10玩家2出拳在“真正”的石头剪刀布游戏中,在每轮之后你都应该宣布胜者。为了保持演示程序简单和 源代码专注,本演示程序不包含这一功能。5.4.2 创立游戏我们的简单应用程序由自己的HTML和一个JavaScript文件组成,并利用两
11、个外部开源 JavaScript资源。第一个JavaScript程序库称作stomp.js,由Jeff Mesnil编写。这个程序 库包含在本书当中,当然也可以在 s:/github /jmesnil/stomp-websocket上找至U, 它使JavaScript应用程序能够在启用WebSocket的ActiveMQ消息代理上使用 STOMP/WSo第二个JavaScript程序库是jQuery,我们用它来简化应用的构建,并帮助我们以更简洁的 方式编写代码。我们包含应用程序逻辑的HTML和JavaScript文件分别称作index.html 和 rps.jso说明我们用jQuery 1.8
12、.2版本构建应用,本书包含精简的jQuery程序库jquery-1.8.2.min, 你也可以从jQuery官方下载网站中下载它: :/jquery /downloado1 .构建HTML文件在这个例子中,我们保持HTML代码简单,以便将重点放在应用程序的消息传递逻辑上。在包含了 JavaScript程序库之后,我们必须为玩家姓名创立表单字段和按钮,如图5-11 所示。/our nameOpponents name Go图5.11创立玩家姓名表单字段然后,我们创立用于游戏指南的div元素,以及另一个用于玩家选择按钮的div,如图5-12所示。Select one:Rock I I Paper
13、Scissors图512代表玩家选择的按钮最后,我们用一个空div元素显示对手的选择。代码清单5-6展示了 HTML文件源代码。代码清单5-6 index.html文件源代码Rock Paper Scissors - a WebSocket DemoSelect one:2 .编写游戏代码现在,我们已经为应用建立了简单的用户界面,可以进一步关注JavaScript代码了。首先, 我们声明变量(见代码清单5-7)。注意,我们包含了指向使用WebSocket、基于STOMP的消息代理一ActiveMQ的连接URL。代码清单5-7声明JavaScript代码中使用的变量/ ActiveMQ STOM
14、P connection URLvar url = ws:/0.0.0.0:61614/stompn;/ ActiveMQ username and password. Default value is guest for both, var un, pw = guest; var client, src dest;/ Variables holding the state whether the local and/ remote user had his/her turn yetvar hasUserPicked, hasOpponentPicked = false;/ HTML code
15、 for the opponents three buttons and variable/ for opponents pickvar opponentsBtns = Rock + Paper + Scissorsf;var opponentsPick; / Variables for this users three buttonsvar rockBtn, paperBtn, scissorsBtn;完整地构建了 DOM层次结构之后,我们检查浏览器是否支持WebSocket。如果不支持, 我们隐藏HTML页面显示的div,并显示一个警告(见代码清单5-8)。代码清单5-8检查浏览器是否支持
16、WebSocket/ Testing whether the browser supports WebSocket. / If it does, fields are rendered for users* names $(document).ready(functionO if (!window.WebSocket) var msg = Your browser does not have WebSocket support. This example will not work properly.;$(#nameFieldsn)-css(nvisibility, nhidden,r); $
17、(,#instructions).css(,visibility, visible); $(H#instructionsH).html(msg); );startGame。函数由goBtn的onclick事件调用。这个函数(见代码清单5-9)禁用前面填 写表单的所有元素,使游戏说明和按钮div可见,并构造源(src)和目标(dest)队列的 名称。代码清单5-9 startGame。函数var startGame = functionQ / Disabling the name input fields $(n#myNameH).attr(ndisabled, disabled); $(H#o
18、pponentName,).attr(,disabled, disabled); $(#goBtn).attr(disabledl disabled); / Making the instructions andbuttons visible $(#instructions).css(Hvisibility, visible); $(#buttons,.css(visibility,7 visible); / Queues are named after the players dest = /queue/ + $n#opponentNamen)-valQ; src =/queue/ + $(
19、#myName),val(); connectQ; ;代码清单5-9中最后一个函数调用了 connect。函数,这个函数建立STOMP连接,如代 码清单5-10所示。connect。函数中的调用由我们使用的开源STOMP JavaScript程序库 stomp.js 提供。代码清单5-10建立STOMP连接的connect。函数/ Establishing the connection var connect = functionQ client = Stomp.client(url); client.connectfun, pw, onconnect, onerror); ;client.c
20、onnect API有两个回调函数。第一个是onconnect。,在成功连接时调用;第二个 是onerror。,在出现错误时调用。我们先来仔细看看。nconnect。回调函数。在控制台上记录我们已经成功连接之后,我们 订阅src变量定义的队列。这个队列根据玩家的姓名命名,当消息到达队列,将执行定义 为client.subscribe第二个参数的回调函数。当进入的消息说明对手已经选择出拳,我们 将hasOpponentPicked设置为true。然后,我们绘制表示对手选择的按钮,但是在玩家 还没有出拳时隐藏,如代码清单5-11所示。代码清单5-11显示游戏按钮的代码/ Function invo
21、ked when connection is established var onconnect = functionQ console.log(uconnected to + url; client.subscriberc, functionmessage console.log(umessage received: + message.body); / The incoming message indicates that the / opponent had his/her turn (picked). / Therefore, we draw the buttons for the o
22、pponent. / If this user hasnt had his/her move yet, / we hide the div containing the buttons, / and only display them / when this user has had his/her move too.hasOpponentPicked = true; if IhasUserPicked $(n#opponentsButtons,).css(uvisibility, hidden; $(u#instructionsn)-html(nYour opponent is waitin
23、g for you.Make your move!Results:如果出现错误,我们可以用onerror。回调函数轻松地处理它,如代码清单5-12所示。测 试函数执行的一种简单方法是首先创立一个连接,然后停止ActiveMQ。这样,你就会在 控制台上看到一条表示连接丧失的错误信息。代码清单5-12用onerror回调函数捕获错误var onerror = function (error) console.log(error); ;代码中最后一个函数在用户选择了3个选项(石头、布或者剪刀)之一时调用。客户端 对象的send。函数有3个参数:目标、首标(在我们的例子中为空)和消息(按钮DOM 对象
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HTML5 WebSocket权威指南 WebSocket 权威 指南
限制150内