1. 程式人生 > >netty入坑第一步:了解netty和編寫簡單的Echo服務器和客戶端

netty入坑第一步:了解netty和編寫簡單的Echo服務器和客戶端

vnr ech pac str 能夠 長連接 pos 通過 pre

早期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服務器和客戶端