Ⅰ java Netty NIO 如何突破 65536 個埠的限制如何做到 10萬~50萬 長連接
首先說一下 伺服器是只監聽一個埠,所有的客戶端連接,都是連接到伺服器的同一個埠上的。也就是說伺服器只是用了一個埠。就比如Http伺服器。默認只用了80埠。
這是解答一些人的這個疑惑。
下面來回答你的問題
nio 在linux上使用的是epoll ,epoll支持在一個進程中打開的FD是操作系統最大文件句柄數,而不是你所說的16位short表示的文件句柄。 而 select模型 單進程打開的FD是受限的 select模型默認FD是1024 。操作系統最大文件句柄數跟內存有關,1GB內存的機器上,大概是10萬個句柄左右。可以通過cat /proc/sys/fs/file-max 查看
這個可以在Netty權威指南第二版的第七頁看到。
我ubuntu虛擬機,2G內存。結果是 200496
2019/05/09 修正一下上面讓人誤會的地方
「伺服器是只監聽一個埠」 這句話 請參照這一段的最後一行 「就比如Http伺服器默認只用了80埠」 我這一段話里說的伺服器並不是指伺服器主機 硬體, 而是說 服務程序。 一個伺服器主機操作系統上 可以運行很多服務程序, 而通常都會說 Netty伺服器、Apache伺服器、tomcat伺服器、Mysql伺服器 , 這里是指 Netty服務端 Apache服務端 tomcat服務端 Mysql服務端 。 再比如 一個游戲的登錄伺服器 沒人會叫他 游戲Netty服務程序 或者Netty登錄服務程序 , 而會稱呼它是 Netty伺服器或者登錄伺服器 或者xxx游戲登錄伺服器之類的。 只是依照行業術語來說的 被誤會了很抱歉 這里解釋一下 。
再次回答一下這個問題 Netty NIO不用突破65536個埠限制 因為根本沒有這個埠限制問題 只有主動發起一個請求 才會佔用一個本地埠 主動發起10個請求 會佔用10個本地埠 我這里說的是長連接 Netty NIO是屬於服務程序 他只需要監聽一個埠 比如8000埠 這時候有10個客戶端 連接到這個Netty伺服器 都是10個客戶端全都連接到伺服器的8000埠 服務端只會佔用8000埠這一個埠 所以不需要突破65536埠限制
Ⅱ java nio框架netty客戶端連接成功後為什麼會自動掉線
其實不要太迷信nio。這個東西如果你使用不當,效率還不如io高。 而且,使用了nio會造成和以前的代碼的不兼容。 當然,你是高手,那就例外了。
Ⅲ java Netty NIO如何突破 65536個埠的限制
一般來說是不可以突破的,埠有限制.
單獨對外提供請求的服務不用考慮埠數量問題,監聽某一個埠即可.但是向提供代理伺服器,就不得不考慮埠數量受限問題了.當前的1M並發連接測試,也需要在客戶端突破6萬可用埠的限制.
埠為16進制,那麼2的16次方值為65536,在linux系統裡面,1024以下埠都是超級管理員用戶(如root)才可以使用,普通用戶只能使用大於1024的埠值.
Ⅳ 怎麼為JAVA NIO或Netty程序設置網路通信代理
服務端
// 設置一個處理客戶端消息和各種消息事件的類(Handler)bootstrap.setPipelineFactory(newChannelPipelineFactory() { @Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline( newObjectDecoder(ClassResolvers.cacheDisabled(this .getClass().getClassLoader())), newObjectServerHandler()); }});
客戶端
// 設置一個處理服務端消息和各種消息事件的類(Handler)
bootstrap.setPipelineFactory(newChannelPipelineFactory() { @Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline(newObjectEncoder(), newObjectClientHandler()); }});
要傳遞對象,自然要有一個被傳遞模型,一個簡單的Pojo,當然,實現序列化介面是必須的。
/** * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class Command implementsSerializable { = 7590999461767050471L; privateString actionName; publicString getActionName() { returnactionName; } publicvoidsetActionName(String actionName) { this.actionName = actionName; }}
服務端和客戶端里,我們自定義的Handler實現如下:
ObjectServerHandler .java
/** * 對象傳遞服務端代碼 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectServerHandler extendsSimpleChannelHandler { /** * 當接受到消息的時候觸發 */ @Override publicvoidmessageReceived(ChannelHandlerContext ctx, MessageEvent e) throwsException { Command command = (Command) e.getMessage(); // 列印看看是不是我們剛才傳過來的那個 System.out.println(command.getActionName()); }}
ObjectClientHandler .java
/** * 對象傳遞,客戶端代碼 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectClientHandler extendsSimpleChannelHandler { /** * 當綁定到服務端的時候觸發,給服務端發消息。 * * @author lihzh * @alia OneCoder */ @Override publicvoidchannelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { // 向服務端發送Object信息 sendObject(e.getChannel()); } /** * 發送Object * * @param channel * @author lihzh * @alia OneCoder */ privatevoidsendObject(Channel channel) { Command command =newCommand(); command.setActionName("Hello action."); channel.write(command); } }
啟動後,服務端正常列印結果:Hello action.
簡單梳理一下思路:
通過Netty傳遞,都需要基於流,以ChannelBuffer的形式傳遞。所以,Object -> ChannelBuffer.
Netty提供了轉換工具,需要我們配置到Handler。
樣例從客戶端 -> 服務端,單向發消息,所以在客戶端配置了編碼,服務端解碼。如果雙向收發,則需要全部配置Encoder和Decoder。
這里需要注意,注冊到Server的Handler是有順序的,如果你顛倒一下注冊順序:
bootstrap.setPipelineFactory(newChannelPipelineFactory() {
@Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline(newObjectServerHandler(), newObjectDecoder(ClassResolvers.cacheDisabled(this .getClass().getClassLoader())) ); }});
結果就是,會先進入我們自己的業務,再進行解碼。這自然是不行的,會強轉失敗。至此,你應該會用Netty傳遞對象了吧。
Ⅳ 有人能說清楚JAVA7 NIO NETTY IOCP之間的聯系嗎
nio是Java的一套socket api 這套api底層是基於操作系統的,底層操作系統可能用的是iocp或者其他。netty是基於nio的一個框架
Ⅵ 有人能說清楚JAVA7 NIO NETTY IOCP之間的聯系嗎
早期網路訪問的做法是,連接以後,就等待對方應答,對方沒有應答,代碼就會死在那裡。這稱為阻塞式通訊。
後來,java 1.4 開始引入了nio, nio是非阻塞式網路通訊. 其實可以理解為系統去掃描埠,如果有返回就處理,沒有的話,代碼就繼續做別的事。
不過nio的編碼比較麻煩,雖然性能好,可是很多代碼還在用阻塞,因為代碼簡單,很多例子上也是socket的。
然後高麗人開發了apache的mina,可以快速開發nio。
後來高麗人離開apache,開發了netty,提供了另一種調用nio的framework。
現在mina和netty是最常用的nio框架。
至於iocp,這個是個系統級的實現,其實類似nio,不過是通過操作系統來實現的。而且只支持windows。java 7以後把iocp引入,提供了快速開發的介面。不過不是很推薦使用。系統實現就表示iocp不再是跨平台的。那麼實用性就差很多了。
Ⅶ netty是什麼
netty是一個封裝了nio的java語言實踐的io框架,使編程人員從繁瑣且容器出bug的nio編程中解放出來,更專注於業務創新能力,而且很多其他的上層框架也會使用netty作為io模塊的實現,例如bbo,spring-gateway之類.沒事可以去黑馬程序員官網視頻庫看免費視頻。
Ⅷ netty超時原因
1、檢查網路的網速是否正常,區域網里是否有人看電影或者下載軟體等拖慢了網速。
2、連接蘋果跟iTunes時,檢查iT的設置情況,打開iTunes -- 編輯 -- 偏好設置 -- 家長控制 -- iTunes Store這一項勾選(把 允許訪問iTunes U 這一項也勾選)-- 確定。再重啟,重開iTunes,回到剛才那個步驟,把剛剛勾選的兩項取消,回iTunes Store登陸。
3、關掉防火牆,在windows 安全中心。1.tomcat比較適合j2ee開發,因為其完整的實現了Servlet和JSP規范
2.tomcat處理高並發請求性能不夠好,比如需要使用NIO時必須要安裝APR插件,確實比較麻煩。
3.netty是一個性能非常好的java NIO網路框架,我們已經在諸多大項目中使用並驗證。
所以:
如果性能要求不高,則選用tomcat 開發上更易用
如果對性能有要求,選用netty,當然其在使用上要更麻煩,最直接的啟停監控腳本得自己來弄。
Ⅸ netty是什麼
Netty是由JBOSS提供的一個java開源框架,現為 Github上的獨立項目。Netty提供非同步的、事件驅動的網路應用程序框架和工具,用以快速開發高性能、高可靠性的網路伺服器和客戶端程序。
也就是說,Netty 是一個基於NIO的客戶、伺服器端的編程框架,使用Netty 可以確保你快速和簡單的開發出一個網路應用,例如實現了某種協議的客戶、服務端應用。Netty相當於簡化和流線化了網路應用的編程開發過程,例如:基於TCP和UDP的socket服務開發。
「快速」和「簡單」並不用產生維護性或性能上的問題。Netty 是一個吸收了多種協議(包括FTP、SMTP、HTTP等各種二進制文本協議)的實現經驗,並經過相當精心設計的項目。最終,Netty 成功的找到了一種方式,在保證易於開發的同時還保證了其應用的性能,穩定性和伸縮性。