netty入坑第一步:了解netty和編寫簡單的Echo服務器和客戶端
早期java API通過原生socket產生所謂的"blocking",大致過程是這樣
這種的特點是每次只能處理一個請求,如果要實現多個請求並行,就還要分配一個新的線程來給每個客戶端的socket‘‘
。但考慮使用這種方法來支持大 量的同步,長連接。在任何時間點多線程可能處於休眠狀態,等待輸入或輸出數據。
這很容 易使得資源的大量浪費,對性能產生負面影響。
netty的構成部分:
Channel:顧名思義,他代表連接到實體(入硬件設備,文件)的套接字和程序組件,能夠執行多個I/O操作的開發連接
Callback,回調,很多時候我們可以將它用於通知某個操作已經完成,netty內部使用回調處理事件的時候,一旦被觸發,事件可
通過ChannelHandler的實現來處理
Future:提供另外一種通知應用操作已經完成的方式.
Echo服務器:
Handler:實現服務器的業務邏輯,決定了連接後和接收信息該如何處理
Bootstrapping:配置服務器的啟動方式,他必須設置一個端口來監聽請求
實現簡單的EchoServer和EchoClient
代碼就不貼了,書裏面都有,再貼就沒必要
然而書裏對maven多模塊構建過程也講的不多,我也踩了坑
首先,構建一個空工程
取好名字,然後next
然後
這裏因為不使用模板,所以不勾選maven模塊,然後填好信息,點擊next,點擊finish
還是這個界面,點擊綠色的+號,跟上面步驟一樣
到達這一步的時候,註意一下,如果這兩個模塊是父子關系,那就一個parent模塊,像這裏,client和server是並列關系, 就不用
之後,將代碼寫進去,對應的代碼卸載對應的模塊裏,不要忘了導入netty的依賴
<!-- https://mvnrepository.com/artifact/io.netty/netty-all --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.32.Final</version> </dependency>
然後準備對應的編譯工作
編譯maven模塊需要的插件:並且還要配置main文件和goal標簽
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <!--指定main文件,不指定會報錯--> <mainClass>EchoServer</mainClass> </configuration> </plugin>
一切工作準備就緒,打開IDEA的終端,輸入mvn clean package
這樣則是編譯成功
在編譯之後,我們需要去相應的模塊裏去執行相應的main函數,那這裏註意一下,就是netty那本書裏面是直接用的mvn exec:java
但是這樣是看不出實驗效果的,需要帶上參數,用mvn exec:java -Dexec.args="arg0 arg1"這樣的才能看出效果,因為這個例子裏指定了
參數的個數判斷,並且將參數的第一個作為監聽的端口,所以需要將後面的參數用整數形式,否則產生NumberFormatException
所以這裏簡單,server模塊裏用exec:java -Dexec.args="1",即監聽端口1,不過在這之前請cd server到server目錄下執行這個命令
然後看到如下信息
再通過cd 命令切換到client的目錄,這次將後面的參數改為兩個
mvn exec:java -Dexec.args="0 1"
然後就會看到,client的有相應的response打印出來
再看到之前的server模塊的終端,也可以看到相應信息
好了,這個東西真的折騰了我挺久,這裏做個記錄,以免今後的人再入坑......
netty入坑第一步:了解netty和編寫簡單的Echo服務器和客戶端