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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

netty socket_Netty:另一种Web(Socket)服务器

發(fā)布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 netty socket_Netty:另一种Web(Socket)服务器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

netty socket

如今, Netty已用于Internet上的各種應(yīng)用程序中,以處理數(shù)千個(如果不是上百萬個)聊天對話,包括Minecraft , Twitter和許多其他應(yīng)用程序在內(nèi)的多人游戲。 但是,它并沒有深入到開發(fā)企業(yè)應(yīng)用程序的企業(yè)程序員的頭腦中。

我相信Netty可以引入其他功能解決方案無法比擬的新功能,因為它具有完全雙向文本和二進(jìn)制非HTTP數(shù)據(jù)傳輸功能,并且比傳統(tǒng)的“每線程線程數(shù)”支持更多的并發(fā)客戶端”服務(wù)器。

您可能知道Netty在WebSockets方面的能力,但是您知道它可以像傳統(tǒng)的Web服務(wù)器一樣出色地工作嗎? 由于其非常周到的設(shè)計,通過在其管道中添加適當(dāng)?shù)奶幚沓绦?#xff0c;Netty幾乎可以處理任何流量。 它還可以同時處理多種類型,例如同時通過同一端口處理WebSocket和HTTP。 通過將這些結(jié)合在一起,程序員可以避免處理諸如CORS(跨源資源共享)之類的麻煩問題,當(dāng)瀏覽器嘗試向未從其下載的服務(wù)器發(fā)出請求時,這些麻煩可能會抬起頭來。

凈值的力量

為了顯示其轉(zhuǎn)換企業(yè)應(yīng)用程序的功能,我整理了一個代碼示例,顯示了Web的傳統(tǒng)示例之一,該示例正在檢索股價。

其他應(yīng)用程序必須發(fā)出AJAX請求,輪詢,具有刷新按鈕等才能更新價格。 WebSockets消除了任何這些需求。 創(chuàng)建持續(xù)開放的雙向連接后,客戶端和服務(wù)器都可以在需要時彼此對話,而無需任何協(xié)商。 因此,客戶端讓服務(wù)器知道任何用戶何時更改標(biāo)準(zhǔn),并且只要相關(guān)數(shù)據(jù)基于該標(biāo)準(zhǔn)發(fā)生變化,服務(wù)器就會更新客戶端。

  • 您可以在此處找到功能齊全的代碼。

我為客戶端設(shè)置了一些基于JSON的協(xié)議,以使服務(wù)器知道用戶的決定。 要將新符號添加到服務(wù)器正在監(jiān)視客戶端的列表中,只需要一個簡單的調(diào)用即可。 這是一個例子:

doSend('{"command":"add", "tickerSymbol":"GOOG"}');

這會將符號添加到列表中。 服務(wù)器的下一次更新將在其數(shù)據(jù)中包括新符號的當(dāng)前股價(來自Yahoo Finance的REST API)。 刪除項目同樣容易:

doSend('{"command":"remove", "tickerSymbol":"GOOG"}');

使用這兩個命令,客戶端可以控制服務(wù)器正在為每個用戶監(jiān)視的符號列表。 在Netty處理程序的服務(wù)器端,程序員要考慮多個用戶的唯一工作是確保為每個新連接創(chuàng)建一個新的處理程序,并且在不共享數(shù)據(jù)的地方不使用靜態(tài)成員。 。 除非另有說明,否則Netty假定處理程序不可共享。

讓我們看看如何為Netty管道定義處理程序。 這來自StockTickerServer類:

ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); p.addLast("encoder", new HttpResponseEncoder()); p.addLast("decoder", new HttpRequestDecoder()); p.addLast("aggregator", new HttpObjectAggregator(65536)); p.addLast("handler", new StockTickerServerHandler()); } });

這里的順序非常重要,因為管道中的每個處理程序都有機(jī)會處理(或不處理)數(shù)據(jù)并將其傳遞給下一個處理程序。 庫存行情處理程序位于底部,因為它是將數(shù)據(jù)發(fā)送回客戶端的程序,因此位于管道的末端。 通過創(chuàng)建處理程序的新實例,每個新連接都將獲得每個處理程序自己的實例。 如果處理程序是無狀態(tài)的并且是線程安全的,則可以在適用的情況下使用單例代替以節(jié)省內(nèi)存。 我使用的處理程序中沒有一個是可共享的,因此這里沒有顯示示例。

Netty作為Web服務(wù)器

使用一些技巧來使Netty同時處理HTTP和WebSocket通信。

1. StockTickerServerHandler擴(kuò)展了SimpleChannelInboundHandler <Object>

這告訴Netty,我們希望所有流量都到達(dá)此處理程序。 否則,如果只想處理HTTP通信,則可以使用SimpleChannelInboundHandler <FullHttpRequest>;如果只想處理WebSocket通信,則可以使用SimpleChannelInboundHandler <WebSocketFrame>。

2. channelRead0(通道讀取為零)方法

@Override protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof FullHttpRequest) { this.handleHttpRequest(ctx, (FullHttpRequest)msg); } else if (msg instanceof WebSocketFrame) { this.handleWebSocketFrame(ctx, (WebSocketFrame)msg); } }

這使我們能夠根據(jù)每種協(xié)議處理HTTP和WebSocket通信。 handleHttpRequest提供HTML,圖像,CSS,JavaScript和所有其他正常的網(wǎng)絡(luò)流量,handleWebSocketFrame指出如何處理從客戶端發(fā)送的自定義消息。

3.啞劇類型

Netty沒有內(nèi)置處理Mime類型的支持,因為WebSocket調(diào)用本質(zhì)上并不需要它們。

我添加了Apache的mime類型文件的稍作修改的版本,并靜態(tài)加載了它。 我正在負(fù)載上進(jìn)行同步,因為Netty可以在開始時為池創(chuàng)建很多處理程序,并且構(gòu)造函數(shù)可以同時由多個處理程序執(zhí)行。 由于該字段是靜態(tài)的,因此在映射變?yōu)榉莕ull之前,可以對其進(jìn)行多次加載。 同步靜態(tài)鎖(不是類的當(dāng)前實例)可以防止這種情況的發(fā)生。

其他詳情

handleWebSocketFrame方法處理WebSocket協(xié)議定義的不同“已知”幀類型。 收到全文框后,我會將其傳遞給我創(chuàng)建的接口的實現(xiàn)者,以指定如何處理業(yè)務(wù)邏輯。

該代碼存在于StockTickerMessageHandler中。 它創(chuàng)建一個后臺線程來檢索股票報價并將其發(fā)送給客戶端,并處理客戶端發(fā)送的命令。

那里有一些凌亂的代碼,用于處理Yahoo發(fā)送的Gzip壓縮數(shù)據(jù)并解析服務(wù)返回的JSON,以及一些使用java.util.concurrent類的代碼(例如Executor,AtomicBoolean,AtomicReference和CopyOnWriteArrayList)來保存后臺線程和Netty處理程序彼此踩踏,因為它們共享有關(guān)通道和當(dāng)前符號列表的詳細(xì)信息。

我還使用Gson將傳入的JSON轉(zhuǎn)換為POJO,以便更輕松地對其進(jìn)行處理。 除此之外,這僅僅是本示例的業(yè)務(wù)目的。

關(guān)于身份驗證的注意事項

我沒有時間向此示例添加身份驗證。 如果這樣做的話,我會使用Shiro ,它是一種功能強(qiáng)大的身份驗證/授權(quán)/密碼框架,可與普通應(yīng)用程序和Web應(yīng)用程序一起使用。 也缺少HTTPS支持,因為這是檢查股票價格的公共應(yīng)用程序。 有添加HTTPS(和WSS)的例子在這里 。

使用JavaScript WebSockets很難(即使不是不可能)的一件事是發(fā)送身份驗證數(shù)據(jù)以及升級請求(即調(diào)用新的WebSocket(uri))。 因此,通常首先像正常網(wǎng)站一樣發(fā)送HTTPS POST并設(shè)置auth cookie令牌。 這樣,發(fā)送升級請求時,cookie會自動發(fā)送。 使用身份驗證時,請記住使用HTTPS和WSS而不是HTTP和WS來保護(hù)數(shù)據(jù)。 身份驗證到位后,就變成了在必要時檢查經(jīng)過身份驗證的用戶的問題,注意某些流量應(yīng)始終通過(HTML,圖像等)。

  • 代碼項目

結(jié)論

Netty已成為構(gòu)建新應(yīng)用程序的一種高性能,改變游戲規(guī)則的方法。 通過利用WebSockets提供的功能,當(dāng)今的企業(yè)應(yīng)用程序可以比現(xiàn)在更具交互性。 我希望您喜歡這個進(jìn)入Netty的小冒險,并請原諒糟糕的瀏覽器客戶端,我只是沒有時間為此示例制作一個不錯的Backbone.js客戶端應(yīng)用程序。

謝謝!

翻譯自: https://www.javacodegeeks.com/2015/03/netty-a-different-kind-of-websocket-server.html

netty socket

總結(jié)

以上是生活随笔為你收集整理的netty socket_Netty:另一种Web(Socket)服务器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。