undertow服务器分析_使用undertow构建和测试Websocket服务器

undertow服务器分析

即将发布的JBoss Application Server版本将不再使用Tomcat作为集成的Web服务器,而是将其替换为undertow 。 undertow的体系结构基于可通过Builder API动态添加到服务器的处理程序。 这种方法类似于在Node.js中构造Web服务器的方式。 它使开发人员可以轻松地将Underwow Web服务器嵌入到其应用程序中。 由于功能是通过Builder API完成的,因此只能添加一个人的应用程序中真正需要的功能。 除此之外,undertow支持WebSockets和版本3.1中的Servlet API。 它可以作为阻塞服务器或非阻塞服务器运行,据说,首次测试已经证明Undertow是用Java编写的最快的Web服务器。

由于所有这些听起来很有希望,所以让我们尝试设置一个简单的websocket服务器。 和往常一样,我们从创建一个简单的Java项目开始,并添加undertow maven依赖项:

<dependency><groupId>io.undertow</groupId><artifactId>undertow-core</artifactId><version>1.0.0.Beta20</version>
</dependency>

使用undertow的Builder API,我们的buildAndStartServer()方法如下所示:

public void buildAndStartServer(int port, String host) {server = Undertow.builder().addListener(port, host).setHandler(getWebSocketHandler()).build();server.start();
}

我们只添加一个侦听器,该侦听器指定用于侦听传入连接的端口和主机,然后添加一个websocket处理程序。 由于websocket处理程序代码更加全面,我将其放入自己的方法中:

private PathHandler getWebSocketHandler() {return path().addPath("/websocket", websocket(new WebSocketConnectionCallback() {@Overridepublic void onConnect(WebSocketHttpExchange exchange, WebSocketChannel channel) {channel.getReceiveSetter().set(new AbstractReceiveListener() {@Overrideprotected void onFullTextMessage(WebSocketChannel channel, BufferedTextMessage message) {String data = message.getData();lastReceivedMessage = data;LOGGER.info("Received data: "+data);WebSockets.sendText(data, channel, null);}});channel.resumeReceives();}})).addPath("/", resource(new ClassPathResourceManager(WebSocketServer.class.getClassLoader(), WebSocketServer.class.getPackage())).addWelcomeFiles("index.html"));
}

让我们逐行浏览此代码段。 首先,我们添加一个新路径:/ websocket。 addPath()方法的第二个参数使我们可以指定要用于此路径的协议类型。 在我们的例子中,我们创建一个新的WebSocket。 匿名实现有一个onConnect()方法,在其中我们设置了AbstractReceiveListener的实现。 在这里,我们有一个方便的方法onFullTextMessage(),当客户端向我们发送文本消息时会调用该方法。 调用getData()将获取我们收到的实际消息。 在这个简单的示例中,我们只是将该字符串回显给客户端,以验证从客户端到服务器以及向后的往返是否有效。

为了执行一些简单的手动测试,我们还在路径/下添加了第二个资源,该资源提供一些静态HTML和JavaScript文件。 包含这些文件的目录作为ClassPathResourceManager的实例给出。 当客户端请求路径/时,addWelcomeFiles()的调用告诉undertow服务器哪个文件。

index.html看起来像这样:

</pre>
<html>
<head><title>Web Socket Test</title></head>
<body><script src="jquery-2.0.3.min.js"></script><script src="jquery.gracefulWebSocket.js"></script><script src="websocket.js"></script><form onsubmit="return false;"><input type="text" name="message" value="Hello, World!"/><input type="button" value="Send Web Socket Data" onclick="send(this.form.message.value)"/></form><div id="output"></div>
</body>
</html>
<pre>

我们JavaScript代码被换成websocket.js文件。 我们使用jquery和jquery-Plugin gracefulWebSocket来简化客户端开发:

var ws = $.gracefulWebSocket("ws://127.0.0.1:8080/websocket");
ws.onmessage = function(event) {var messageFromServer = event.data;$('#output').append('Received: '+messageFromServer+'');
}function send(message) {ws.send(message);
}

通过调用$ .gracefulWebSocket()创建WebSocket对象后,我们可以为传入消息注册回调函数。 在此方法中,我们仅将消息字符串附加到页面的DOM。 send()方法只是对gracefulWebSocket的send()方法的调用。

现在启动应用程序并在Web浏览器中打开URL http://127.0.0.1:8080/时 ,我们将看到以下页面:

Undertow-websocket

输入一些字符串并单击“发送Web套接字数据”按钮,将消息发送到服务器,服务器作为响应将其回显给客户端。

既然我们知道一切都会按预期进行,那么我们想使用junit测试用例来保护我们的代码免于回归。 作为一个websocket客户,我选择了jetty-websocket库:

<dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-websocket</artifactId><version>8.1.0.RC5</version><scope>test</scope>
</dependency>

在测试案例中,我们构建并启动websocket服务器以打开到websocket端口的新连接。 jetty-websocket的WebSocket实现允许我们为open和close事件实现两种回调方法。 在打开的回调中,我们将测试消息发送给客户端。 其余代码等待连接建立,关闭连接并断言服务器已收到消息:

@Test
public void testStartAndBuild() throws Exception {subject = new WebSocketServer();subject.buildAndStartServer(8080, "127.0.0.1");WebSocketClient client = new WebSocketClient();Future connectionFuture = client.open(new URI("ws://localhost:8080/websocket"), new WebSocket() {@Overridepublic void onOpen(Connection connection) {LOGGER.info("onOpen");try {connection.sendMessage("TestMessage");} catch (IOException e) {LOGGER.error("Failed to send message: "+e.getMessage(), e);}}@Overridepublic void onClose(int i, String s) {LOGGER.info("onClose");}});WebSocket.Connection connection = connectionFuture.get(2, TimeUnit.SECONDS);assertThat(connection, is(notNullValue()));connection.close();subject.stopServer();Thread.sleep(1000);assertThat(subject.lastReceivedMessage, is("TestMessage"));
}
  • 和往常一样,您可以在github上找到源代码。

结论

Undertow的Builder API使构建Websocket服务器和满足您需求的嵌入式Web服务器变得容易。 这也简化了自动测试,因为您不需要在集成测试之前和之后启动和停止服务器的任何特定maven插件。 除此之外,jQuery插件jquery-graceful-websocket允许您仅使用几行代码就可以通过websocket发送和接收消息。

参考:在Martin's Developer World博客上,由我们的JCG合作伙伴 Martin Mois 用underww构建和测试了一个websocket服务器 。

翻译自: https://www.javacodegeeks.com/2013/11/building-and-testing-a-websocket-server-with-undertow.html

undertow服务器分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

湖北农商行计算机类笔试,2018湖北农商行招聘考试面试考多少分,才能进笔试?...

原标题&#xff1a;2018湖北农商行招聘考试面试考多少分&#xff0c;才能进笔试&#xff1f;昨天&#xff0c;湖北农商行各地农商行面试分数线陆续出来了&#xff0c;恭喜过线的小伙伴&#xff0c;你们顺利的进入了笔试阶段&#xff0c;接下来小编给大家说一下各地的进笔试的分…

计算机共享原理,synchronize底层原理 游戏电脑问题解决分享!

sync1 package com.paddx.test.concurrent;23 public class SynchronizedDemo {4 public void method() {5 synchronized (this) {6 System.out.println("Method 1 start&quot&#x1f609;;7 }8 }9 }反编译结果&#xff1a;关于这两条指令的作用&#xff0c;我们直接…

单元测试反模式,完整列表

我前段时间写过有关OOP中的反模式的文章 。 现在该写单元测试反模式了&#xff0c;因为它们也存在&#xff0c;并且有很多。 我将尝试在列表中包括我知道的每个示例。 如果您认识其他任何人&#xff0c;请通过请求请求将其添加&#xff0c;或在下面发表评论。 对于每个反模式&a…

功能Java示例 第6部分–用作参数

这是称为“ Functional Java by Example”的系列文章的第6部分。 我在本系列的每个部分中发展的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在前面的部分&#xff0c;我们试图通过移动尽可能多的副作用&#xff0c;如IO&#xff0c;该系统的外部&#xff0c;以使我…

系统属性的JDK 12 Javadoc标记

JDK 12 Early Access Build 20 &#xff08; 2018/11/15 &#xff09;可用&#xff0c;可以用来试用新的Javadoc标签{systemProperty} 。 新的{systemProperty} Javadoc标记在core-libs-dev邮件列表消息“ FYI&#xff1a;用于文档系统属性的新javadoc标记 ”中进行了讨论&…

功能Java示例 第5部分–将I / O移到外部

这是称为“ Functional Java by Example”的系列文章的第5部分。 在上一部分中&#xff0c;我们停止了对文档的变异&#xff0c;并返回了数据的副本。 现在&#xff0c;我们需要移走一些I / O。 如果您是第一次来&#xff0c;最好是从头开始阅读。 它有助于了解我们从何处开始…

实现打包后修改服务器接口地址,vue打包之后生成一个配置文件修改接口

我们的vue代码打包上传到服务器之后&#xff0c;生成一个配置文件&#xff0c;里面可以配置域名或其它什么字段之类的&#xff0c;这样以后换了域名&#xff0c;只修改这个配置文件即可。第一步&#xff1a;安装generate-asset-webpack-plugin插件npm install --save-dev gener…

我的世界无人维护的服务器,我的世界:如何进入9年无人管理的2B2T?全球最大战争服务器!...

原标题&#xff1a;我的世界&#xff1a;如何进入9年无人管理的2B2T&#xff1f;全球最大战争服务器&#xff01;2b2t因混乱和9年无人管理而闻名于世&#xff0c;目前是全球最大的《我的世界》战争服务器&#xff0c;同时又是第二大Minecraft古老的服务器。​最近很多小伙伴都在…

集团bim对集团项目服务器,BIM再添一员,五洋建设集团BIM项目组举行成立仪式

BIM项目组的成立&#xff0c;标志着五洋建设集团自此迈入了可视化数字建筑信息模型的阵营&#xff0c;掀开了五洋建设集团设计、施工一体化服务新的一页。随后&#xff0c;五洋建筑设计院院长金杭杭主持召开了工作会议。金杭杭院长在致辞中表示&#xff0c;由建设集团技术管理中…

java pojo使用_在POJO中使用ThreadLocal进行Java嵌套事务

java pojo使用大多数嵌套事务是使用EJB实现的&#xff0c;现在我们尝试在POJO上实现嵌套事务。 在这里&#xff0c;我们使用了ThreadLocal的功能。 了解嵌套事务 事务可以嵌套在另一个内部。 因此&#xff0c;内部事务或外部事务可以回滚或提交&#xff0c;而不会影响其他事务…

Java开发人员应该知道的5大Spring Boot功能

您可能已经听说过Spring Boot&#xff0c;这是用不到140个字符创建一个Spring Web应用程序的神奇力量&#xff0c;可以在一条推文中编写这些字符&#xff0c;但这到底意味着什么&#xff1f; 哪些功能可以使Spring Boot具有如此强大的功能并使Spring应用程序开发如此容易&#…

java 使用本机代理_Java与本机代理–他们所做的强大功能

java 使用本机代理在安装代理之前应了解的内容及其对代码的影响 在构建可伸缩的服务器端应用程序时&#xff0c;我们花费大量时间思考如何在生产中监视&#xff0c;操作和更新代码。 已经开发出一种新的工具来帮助Java和Scala开发人员做到这一点。 它们中的许多都是建立在最强大…

在任何无法理解的情况下,请编写脚本

脚本编写是使您的应用程序在运行时就可以根据客户需求进行调整的最流行的方法之一。 与往常一样&#xff0c;此方法不仅带来好处&#xff0c;例如&#xff0c;在灵活性和可管理性之间存在众所周知的折衷方案。 本文不是从理论上讨论优缺点的文章之一&#xff0c;而是从实践上展…

下载anaconda时出现“Please make sure you are connected to the internet”警告

如题&#xff0c;在anaconda下载过程中下载VScode时出现下图的警告。 百度翻译&#xff1a; 顺着图中指定文件路径&#xff0c;找到vscode_inst.py.log文件&#xff08;注&#xff1a;有些人ProgramData文件夹可能找不到&#xff0c;打开任意文件夹&#xff0c;点击查看&…

多个公证员提高网络吞吐量

您是否需要非常高吞吐量的Corda网络&#xff1f; 网络的吞吐量是否稳定&#xff1f; 您是否已经从其他领域挤出了所有可能的表现&#xff1f; 如果您对这些问题的回答是“是”&#xff0c;那么我可能会为您提供一些有用的信息。 我列出了这些问题&#xff0c;以减少您过早优化C…

初识FPGA(搬运)

原文链接1原文链接2 fpga简介 FPGA&#xff08;Field&#xff0d;Programmable Gate Array&#xff09;&#xff0c; 即现场可编程门阵列&#xff0c;它是在PAL&#xff08;可编程阵列逻辑&#xff09;、GAL&#xff08;通用阵列逻辑器件&#xff09;、CPL&#xff08;复杂可…

蓝桥杯小白系列之汇编点亮led灯

蓝桥杯小白系列之汇编点亮led灯 1、源代码 2、逐条分析 (1)ORG 0000H (2)START: 伪指令,编译器可识别,单片机不可识别,可以随便起。 (3)蜂鸣器设置 蓝桥板插电以后蜂鸣器常会自动响起,故在程序前提前加上如下代码,让蜂鸣器不响: mov P2,#0A0H mov P0,#000H 参照…

带有Oracle Digital Assistant和Fn Project的会话式UI。 第二部分

在上一篇文章中&#xff0c;我使用Oracle Digital Assistant为FlexDeploy实现了一个对话式UI。 今天&#xff0c;我将用Fn Flow丰富它&#xff0c;以便聊天机器人接受发行名称而不是ID来创建快照。 完成后&#xff0c;对话听起来会更加自然&#xff1a; … “您可以建立快照吗…

小白系列之51单片机的入门速成法

51单片机的入门速成法 01-经典51内核资源全览浓缩图 02-重要外设特殊功能寄存器概览 03-程序开发流程与设计要点 04-三大外设的开发与可重用代码 05-应用程序设计入门一例通 01-经典51内核资源全览浓缩图 <1> 四组8位并行I/O端口&#xff1a; P0端口&#xff1a;PC门&a…

蓝桥杯基础模块1:LED跑马灯

一、模块题目 二、原理简述 1、74HC138:三八译码器(3个输入,8个输出) 2、74HC573:锁存器(20个引脚,D1D8是数据输入端,Q1Q8是数据输出端&#