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/時 ,我們將看到以下頁面:
輸入一些字符串并單擊“發送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發送和接收消息。
翻譯自: https://www.javacodegeeks.com/2013/11/building-and-testing-a-websocket-server-with-undertow.html
undertow服務器分析
總結
以上是生活随笔為你收集整理的undertow服务器分析_使用undertow构建和测试Websocket服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果发布 iPadOS 17 正式版:引
- 下一篇: 单元测试反模式,完整列表