Java游戲服務器系列之Netty相關(guān)知識總結(jié)
一、簡介
Java的底層API逐漸復雜,而開發(fā)者面對的開發(fā)場景需求也在逐漸增大。如果直接針對底層API進行編程,無疑是耗時耗力的。這時就催生了極多的編程框架,這些框架隱藏了API實現(xiàn)的復雜細節(jié),以最簡潔的方式給開發(fā)人員提供功能的實現(xiàn)接口。Netty就是一款針對于網(wǎng)絡鏈接的框架,他的出現(xiàn)讓服務器開發(fā)人員更加的集中關(guān)注于更多邏輯的實現(xiàn),而不為了實現(xiàn)更好更多更穩(wěn)定的鏈接而頭疼。Netty的核心功能基于NIO 實現(xiàn)。
二、Netty的應用場景
幾乎適用于所有的長短鏈接場景,由于Java應用的廣泛性,幾乎所有的互聯(lián)網(wǎng)公司或多或少的都會使用到。博主從事游戲開發(fā),可以說幾乎所有短鏈接游戲服務器都是使用Netty開發(fā),實效性要求比較高也有熱修復需求的服務器一般不會使用Java,目前采用更多的是C+Lua的組合方式。Java不可以熱修復是很多長鏈服務器不考慮java 的一個重要原因。
三、異步和事件驅(qū)動性
NIO 文章中強調(diào)了,這種模型的主要特地拿就是異步和事件驅(qū)動性,異步是服務器不需要一直等待鏈接輸入直到鏈接關(guān)閉。而是可以在某個特定的時候去相應鏈接的輸入,而特定的時候就是另一個事件驅(qū)動性,鏈接發(fā)生變化時,會產(chǎn)生一個事件,而NIO模型檢測到這個事件之后,會去相應這個事件的處理事件。
四、Netty核心組件
1.Channel:
Channel時Java-NIO的一個基本構(gòu)造,它代表到一個實體的開放鏈接,如讀操作和寫操作,在NIO模型中也可以被理解成一個入站或者出站的數(shù)據(jù)載體,可以被關(guān)閉或者關(guān)閉。
2.回調(diào) ChannelHandler:
一個回調(diào)就是一個方法,Netty提供了兩個子類,ChannelInboundHandlerAdapter 以及 ChannelOutboundHandlerAdapter ,這兩個子類分別可以應用于數(shù)據(jù)進站和出站時期,各種階段的回調(diào),比如入站時Active方法,表明鏈接剛剛被建立起,代碼如下:
public class ConnectHandler extend ChannelInboundHandlerAdapter{ @override public void ChannelActive(ChannelHandlerContext ctx){ //數(shù)據(jù)入站回調(diào)子類被建立時調(diào)用,也就是鏈接建立時調(diào)用 System.out.println("遠程客戶端 : "+ ctx.channel().remoteAddress() + '建立鏈接'); } }
不了解Netty的讀者看到這里可能會有點疑惑,這個類應該怎么用。這里簡單的解釋一下:這種類會在Netty創(chuàng)建的時候注冊進服務中,然后在數(shù)據(jù)進站、出站的不同階段,調(diào)用這個類中不同的回調(diào)函數(shù),以處理不同的開發(fā)需求??梢躁P(guān)注一下讀者其他的文章
3.Future:
jdk-Future:Java中提供了Future的實現(xiàn),這種Futrue可以看作是一個異步操作結(jié)果的占位符。我們可以通過這個Future查詢到這個異步操作的結(jié)果,并進行一些處理。比如在操作失敗的時候拋出異常。但是jdk內(nèi)置的Future的查詢只能在某個時刻手動去查詢結(jié)果,或者直接阻塞這個異步操作,直到異步完成操作之后可以查詢Future的成功或者失敗。
ChannelFuture:Netty內(nèi)部提供的Future實現(xiàn)類,很多異步操作在執(zhí)行的時候都會返回一個ChannelFuture對象,我們可以針對這個ChannelFuture對象設置一些回調(diào)函數(shù),比如重寫operationComplete()方法,這樣這個異步事件在完成的時候會自動調(diào)用這個方法,并且執(zhí)行我們自己的處理邏輯。
接下來可以看一下ChannelFuture的應用實例,檢測Netty服務器鏈接遠程地址是否成功:
Channel channel = ""; //鏈接地址192.168.100.113 的7000端口 InetSocketAddress socketAddress = new InetSocketAddress("192.168.100.113",7000); //管道綁定地址并返回一個ChannelFuture ChannelFuture channelFuture = channel.connect(socketAddress); //給ChannelFuture設置完成回調(diào),判斷這個操作是否完成 channelFuture.addListener(new ChannelFutureListener(){ @override public void operationComplete(ChannelFuture future){ if(future.isSucess()){ //創(chuàng)建一個字符串,并指定所使用的字符集,下面這種寫法是Netty中經(jīng)常遇到的 ByteBuf buffer = Unpooled.copiedBuffer("Hello",Charset.defaultCharset()); //發(fā)送信息并且返回一個新的writeFuture,依舊可以根據(jù)這個writeFuture處理一些邏輯 ChannelFuture writeFuture = future.channel().writeAndFlush(buffer); }else{ //鏈接失敗則答應出失敗的消息 Throwable cause = future.cause(); cause.printStackTrace(); } } })
五、總結(jié)
Netty以一種異步事件驅(qū)動以及回調(diào)的方式,能幫我們快速完善服務器處理數(shù)據(jù)的進出,以及各個流程細節(jié)中的處理邏輯。極大的精簡了服務器開發(fā)人員在,鏈接處理,數(shù)據(jù)出入方面的開發(fā)工作。是一個及其易用且穩(wěn)定的網(wǎng)絡開發(fā)框架。
到此這篇關(guān)于Java游戲服務器系列之Netty相關(guān)知識總結(jié)的文章就介紹到這了,更多相關(guān)Java Netty內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java異常java.lang.UnsatisfiedLinkError: no opencv_ja
這篇文章主要介紹了Java異常java.lang.UnsatisfiedLinkError: no opencv_java320 in java.library.path的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Java使用黑盒方式模擬實現(xiàn)內(nèi)網(wǎng)穿透
這篇文章主要介紹了Java使用黑盒方式模擬實現(xiàn)內(nèi)網(wǎng)穿透,內(nèi)網(wǎng)穿透,也即 NAT 穿透,進行 NAT 穿透是為了使具有某一個特定源 IP 地址和源端口號的數(shù)據(jù)包不被 NAT 設備屏蔽而正確路由到內(nèi)網(wǎng)主機,需要的朋友可以參考下2023-05-05Mybatis-Plus Wrapper條件構(gòu)造器超詳細使用教程
接口方法的參數(shù)中,會出現(xiàn)各種 Wrapper,比如 queryWrapper、updateWrapper 等。Wrapper 的作用就是用于定義各種各樣的條件(where)。所以不管是查詢、更新、刪除都會用到Wrapper2022-03-03