日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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發送和接收消息。

參考:在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服務器分析

總結

以上是生活随笔為你收集整理的undertow服务器分析_使用undertow构建和测试Websocket服务器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。