JavaWebSocket编程开发、部署和保护动态Web应⽤参考1.1 创建第⼀个WebSocket应⽤
《Java WebSocket编程 开发、部署和保护动态Web应⽤》第1章 Java WebSocket基本原理,本章介绍Java WebSocket API并粗略了解其功能。本章将深⼊介绍⼀个⽰例应⽤,此⽰例应⽤的服务器端简单地回显客户端发给它的任意消息。我们将通过此⽰例来阐述Java WebSocket API的主要特性。本书节为⼤家介绍创建第⼀个WebSocket应⽤。
第1章 Java WebSocket基本原理
本章介绍Java WebSocket API并粗略了解其功能。本章将深⼊介绍⼀个⽰例应⽤,此⽰例应⽤的服务器端简单地回显客户端发给它的任意消息。我们将通过此⽰例来阐述Java WebSocket API的主要特性。这样做,本章将建⽴本书其他部分所需要描述的主要特性的基础。如果你需要复习WebSocket协议的主要概念,请在继续学习之前先看看"前⾔"部分。
1.1 创建第⼀个WebSocket应⽤
既然WebSocket协议的核⼼是使得两个对等节点间能够进⾏消息通信,那么我们将从最简单的⽰例(EchoServer应⽤)来开始介绍Java WebSocket API。
EchoServer应⽤是⼀个客户端/服务器应⽤。它的客户端是运⾏在Web浏览器上的⼀⼩段JavaScript,其
服务器是⼀个WebSocket端点。此端点通过使⽤Java WebSocket API进⾏编写,作为Web应⽤的⼀部分部署并运⾏在应⽤服务器上。当⽤户通过浏览器载⼊Web页⾯时,在⽤户的命令下,这个JavaScript代码⽚段会被执⾏。此代码执⾏时⾸先要做的事是连接存在于应⽤服务器上的Java EchoServer WebSocket端点并在连接之后⽴刻发送⼀条消息。运⾏在应⽤服务器上的Java EchoServer端点等待⼊站的连接,并且在其接收到⼀个已连接的客户端发送的消息时,⽴刻对其进⾏回复,确认已收到消息。
通过此应⽤,也就是EchoServer,可以阐述已经创建的WebSocket端点的关键⽅⾯。虽然该⽰例特别简单,但是充分理解其创建和部署过程将有助于我们迅速理解Java WebSocket API的关键特性。在本⽰例中,我们不会详述任何关键特性,⽽是会给出⼀个全局图,可以将该⽰例作为学习Java WebSocket API的⼀个很好的起点,在本书的后续章节将会更详细地阐述这些特性。
此⽰例⼤体上包括两⼤部分:第⼀部分同时也是最重要的是开发并部署在服务器上的Java EchoServer端点;第⼆部分是运⾏于浏览器中的Web页⾯,它包含JavaScript WebSocket客户端。图1-1展⽰了该⽰例的部署总图。
1.1.1 创建WebSocket端点
幸运的是,创建第⼀个WebSocket端点并部署到应⽤服务器中⾮常简单。你所要做的全部事情是开发
⼀个Java类,实现想让此端点所拥有的功能,并且了解怎样将Java WebSocket API中定义的少数⼏个Java注解应⽤于开发的Java类上。对于⽰例EchoServer来说,我们想要其实现从⼀个已连接客户端接收消息并⽴即将这个消息返回给此客户端的功能。
让我们⽴刻开始实现该功能。⾸先创建⼀个如代码清单1-1所⽰的名为EchoServer的Java类,然后为其添加⼀个⽅法,此⽅法的参数是String类型的,⽤于保存客户端发送的任意⼊站消息。此⽅法的返回值也是String类型。⽆论客户端何时发送⼀个⼊站消息,我们都希望此返回值可以⽤来将此消息发送回客户端。
代码清单1-1:简单的Java对象(POJO)
1. public class EchoServer {
2. public String echo(String incomingMessage) {
3. return "I got this (" + incomingMessage + ")"
4. + " so I am sending it back !";
5. }
6. }
此时,你也许乐于知道你已经实现了此应⽤所需要的所有逻辑。所剩下的⼯作就是使⽤Java WebSocket API将此简单传统的Java对象转换成⼀个WebSocket。为此,仅仅需要Java WebSocket API中的两个Java注解:@ServerEndpoint和@OnMessage。
注解@ServerEndpoint是类级别的注解,⽤于告诉Java平台它注解的类实际上要成为⼀个WebSocket端点。此注解的唯⼀强制参数是相对URI(Uniform Resource Identifier,统⼀资源标识符),开发⼈员希望这个端点在此相对URL之下可⽤。这个场景有点类似于给别⼈电话号码,使得⼤家可以通过电话号码打电话。为了使⽰例更加简单,将使⽤URI /echo来发布⽰例创建的新端点。
因此,对EchoServer类添加如代码清单1-2所⽰的注解:
代码清单1-2:演化为WebSocket端点的POJO类
1. import javax.websocket.server.ServerEndpoint;
2.
3. @ServerEndpoint("/echo")
4. public class EchoServer {
5. public String echo(String incomingMessage) {
6. return "I got this (" + incomingMessage + ")"
7. + " so I am sending it back !";
8. }
9. }
注意属性的名称是value,它定义了端点将被发布在其下的路径,这意味着甚⾄不必将属性名称写到注解定义中。
现在代码已经包含了WebSocket实现能够运⾏的⾜够的信息,它将知道发布端点的URI空间。你可能想知道相对URI到底是相对于什么URI:它相对于包含⽰例EchoServer端点的Web应⽤的上下⽂根。然⽽,因为并未告诉WebSocket实现当端点接收到消息时将会调⽤哪些⽅法,所以将Java类转换成WebSocket端点的过程还未结束。因为EchoServer类只有⼀个⽅法,在此⽰例中这点也许⾮常明显。然⽽,在更复杂的⽰例中,实现WebSocket端点的Java类有多个⽅法,你可能希望⼀些⽅法在WebSo
cket事件发⽣⽽不是在WebSocket消息发⽣时被调⽤,⼀些⽅法不需要直接和WebSocket事件有任何直接关系。⽆论如何,为了将实现⽅法标记为随时准备处理任何⼊站消息,需要使⽤⽅法级注解@OnMessage。
不管你相信与否,你刚刚已经编写完了如代码清单1-3所⽰的第⼀个WebSocket端点。
代码清单1-3:WebSocket端点
1. import javax.websocket.server.ServerEndpoint;
2. import javax.websocket.OnMessage;
3.
4. @ServerEndpoint("/echo")
5. public class EchoServer {
6.
7. @OnMessage
8. public String echo(String incomingMessage) {
9. return "I got this (" + incomingMessage + ")"
10. + " so I am sending it back !";
11. }
12. }
1.1.2 部署端点
部署EchoServer WebSocket端点特别简单。你需要编译源⽂件,并将编译后的类⽂件包含在WAR⽂件中,最后部署WAR⽂件。Web容器将检测到WAR⽂件中包含的WebSocket端点,并且完成必要的设置和部署⼯作。⼀旦完成这些步骤后,就可以⾸次调⽤WebSocket端点了。我们很快就会看到⼀些其他的端点,为了部署它们可以有更多的设置⼯作,但是暂时可以先看看调⽤刚刚创建的端点的客户端代码。
1.1.3 创建WebSocket客户端
在本⽰例以及本书的众多⽰例中,我们将⽤来调⽤服务器端点的客户端将以利⽤JavaScript WebSocket API的JavaScript代码⽚段的形式存在。这些代码⽚段将被嵌⼊Web页⾯,并且被打包在包含WebSocket端点的WAR⽂件中。Java WebSocket API也有客户端API的特性,开发⼈员可以使⽤Java WebSocket API创建应⽤的客户端,代替使⽤Web页⾯上的JavaScript连接到WebSocket服务器端点。第3章中将介绍WebSocket应⽤的Java客户端。然⽽,在本⽰例以及本书中的其他⼏个⽰例中,将利⽤简单的JavaScript API进⾏访问。因为所有⽀持WebSocket的浏览器都⽀持JavaScript API,所以它是⼀个⼴泛的选择。
在本⽰例应⽤中,Web客户端是⼀个带有按钮的Web页⾯。当按钮被按下时,将导致WebSocket客户端创建⼀个到EchoServer端点的WebSocket连接,并发送⼀条消息。每当JavaScript WebSocket接收到⼀条消息时,它将消息显⽰在Web页⾯中,这样⽤户能够看到它,同时也会关闭WebSocket连接。在本书后⾯章节中将能够看到⽣命周期更长的WebSocket连接,⽬前仅仅简单阐述其第⼀次交互。
代码清单1-4所⽰是将调⽤EchoServer的Web页⾯的代码,包括最重要的JavaScript WebSocket客户端代码。
代码清单1-4:Echo JavaScript客户端
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <meta http-equiv="Content-Type" content="text/html;
5. charset=UTF-8">
6. <title>Web Socket JavaScript Echo Client</title>
7. <script language="javascript" type="text/javascript">
8. var echo_websocket;
9.
10. function init() {
11. output = ElementById("output");
12. }
13.
14. function send_echo() {
15. var wsUri = "ws://localhost:8080/echoserver/echo";
16. writeToScreen("Connecting to " + wsUri);
17. echo_websocket = new WebSocket(wsUri);
18. pen = function (evt) {
19. writeToScreen("Connected !");
20. doSend(textID.value);
21. };
22. ssage = function (evt) {
23. writeToScreen("Received message: " + evt.data);
24. echo_websocket.close();
25. };
26. r = function (evt) {
27. writeToScreen('<span >
28. ERROR:</span> ' + evt.data);
29.
30. echo_websocket.close();
31. };
32. }
33.
34. function doSend(message) {
35. echo_websocket.send(message);
35. echo_websocket.send(message);
36. writeToScreen("Sent message: " + message);
37. }
38.
39. function writeToScreen(message) {
40. var pre = ateElement("p");
41. pre.style.wordWrap = "break-word";
42. pre.innerHTML = message;
43. output.appendChild(pre);
44. }
45. window.addEventListener("load", init, false);
46.
47. </script>
48. </head>
49. <body>
50. <h1>Echo Server</h1>
51.
52. <div >
53. <form action="">
54. <input onclick="send_echo()" value="Press to send" type="button">
55. <input id="textID" name="message" value=
56. "Hello Web Sockets" type="text">
57. <br>
58. </form>
59. </div>
60. <div id="output"></div>
61. </body>
62. </html>
现在如果运⾏该应⽤,将得到如图1-2所⽰的输出。
⽬前为⽌,你已经创建、部署并且运⾏了第⼀个WebSocket应⽤,我们可以不必关注代码,休息⼀下,转⽽看看这个⾮常简单的应⽤中包含的有关Java WebSocket API的基本概念。
1.2 WebSocket端点
我们使⽤术语"端点"来表⽰WebSocket对话的⼀端。当通过@ServerEndpoint来注解EchoServer类时,它将简单传统的Java类转换成⼀个逻辑上的WebSocket端点。当部署包含EchoServer类的应⽤时,WebSocket实现⾸先扫描包含EchoServer类的WAR⽂件,到其中的WebSocket端点。然后,它将此类注册成WebSocket端点。当客户端通过URI /echo来尝试建⽴到端点的连接时,因为该URI匹配请求中的URI,WebSocket实现将创建EchoServer类的⼀个新实例,并使得此EchoServer类的实例为后续的WebSocket对话服务。当按下⽰例Web页⾯中的按钮时将调⽤此实例,其存活时间和WebSocket连接的活跃时间保持⼀致。
注意:
端点是Java WebSocket API组件模型的中⼼:每⼀个使⽤Java WebSocket API所创建的WebSocket应⽤都有WebSocket端点的参与。
⽬前为⽌,我们已经了解了使⽤Java WebSocket API创建端点的两种⽅式中的⼀种。EchoServer⽰例阐述了如何使⽤Java WebSocket API注解将简单Java类转换成WebSocket端点。第⼆种⽅式是继承Java WebSocket API中的Endpoint抽象类。若如此,此⼦类将成为WebSocket端点,下⼀节将马上对其进⾏描述。
注意:
⽬前存在两种Java WebSocket端点:注解式端点和编程式端点。注解式端点是通过Java WebSocket API注解将Java类转换成Java WebSocket端点。编程式端点是通过继承Java WebSocket API中的Endpoint类来实现。
在讨论什么情况下选择注释式端点和什么情况下选择编程式端点之前,你应该知道,⽆论采⽤哪种⽅法,总的来说都已经可以利⽤Java WebSocket API的⼤多数特性
webserver接口开发1.3 编程式端点
前⾯已经介绍过注解式端点,这⾥主要介绍编程式端点。下⼀个⽰例和之前描述过的EchoServer⽰例⼀样,因为前⾯已经介绍过,所以你将会很快熟悉它。但它是以编程式端点编写,⽽不是以注解式端点编写。
为了创建编程式端点类型的EchoServer服务器端端点,我们需要做的第⼀件事情是编写Java类,此类继承Java WebSocket API中的Endpoint类。为了这样做,Endpoint类要求实现它的onOpen()⽅法。此⽅法的⽬的在于,只要客户端连接上所创建的端点实例,就为它注⼊⽣命。传⼊此⽅法的参数是Java WebSocket API的核⼼类。在详细介绍此API之前,先来看看代码。
此处不再列出客户端代码,如果仔细检查编程式EchoServer应⽤的JavaScript客户端,你会发现它和
注解式EchoServer⼏乎完全⼀样。唯⼀不同的地⽅是它使⽤了不同的URI来连接编程式EchoServer端点。
1. ws://localhost:8080/programmaticechoserver/programmaticecho
就像我们即将看到的,服务器上的编程式端点映射成/programmaticecho,⽽不是/echo。
既然明确了这⼀点,让我们看看代码清单1-5所⽰的编程式端点。
代码清单1-5:编程式端点⽰例
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论