Netty是什麼?
本質:JBoss做的一個Jar包
目的:快速開發高性能、高可靠性的網絡服務器和客戶端程序
優點:提供異步的、事件驅動的網絡應用程序框架和工具
通俗的說:一個好使的處理Socket的東東
如果沒有Netty?
遠古:java.net + java.io
近代:java.nio
其他:Mina,Grizzly
爲什麼不是Mina?
1、都是Trustin Lee的作品,Netty更晚;
3、Netty的文檔更清晰,很多Mina的特性在Netty裏都有;
4、Netty更新週期更短,新版本的發佈比較快;
Netty的特性
設計
統一的API,適用於不同的協議(阻塞和非阻塞)
基於靈活、可擴展的事件驅動模型
高度可定製的線程模型
可靠的無連接數據Socket支持(UDP)
性能
更好的吞吐量,低延遲
更省資源
儘量減少不必要的內存拷貝
安全
完整的SSL/TLS和STARTTLS的支持
能在Applet與Android的限制環境運行良好
健壯性
不再因過快、過慢或超負載連接導致OutOfMemoryError
不再有在高速網絡環境下NIO讀寫頻率不一致的問題
易用
完善的JavaDoc,用戶指南和樣例
簡潔簡單
僅信賴於JDK1.5
- /**
- * Netty 服務端代碼
- *
- * @author lihzh
- * @alia OneCoder
- * @blog http://www.coderli.com
- */
- public class HelloServer {
- public static void main(String args[]) {
- // Server服務啓動器
- ServerBootstrap bootstrap = new ServerBootstrap(
- new NioServerSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- // 設置一個處理客戶端消息和各種消息事件的類(Handler)
- bootstrap
- .setPipelineFactory(new ChannelPipelineFactory() {
- @Override
- public ChannelPipeline getPipeline()
- throws Exception {
- return Channels
- .pipeline(new HelloServerHandler());
- }
- });
- // 開放8000端口供客戶端訪問。
- bootstrap.bind(new InetSocketAddress(8000));
- }
- private static class HelloServerHandler extends
- SimpleChannelHandler {
- /**
- * 當有客戶端綁定到服務端的時候觸發,打印"Hello world, I'm server."
- *
- * @alia OneCoder
- * @author lihzh
- */
- @Override
- public void channelConnected(
- ChannelHandlerContext ctx,
- ChannelStateEvent e) {
- System.out.println("Hello world, I'm server.");
- }
- }
- }
- /**
- * Netty 客戶端代碼
- *
- * @author lihzh
- * @alia OneCoder
- * @blog http://www.coderli.com
- */
- public class HelloClient {
- public static void main(String args[]) {
- // Client服務啓動器
- ClientBootstrap bootstrap = new ClientBootstrap(
- new NioClientSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- // 設置一個處理服務端消息和各種消息事件的類(Handler)
- bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
- @Override
- public ChannelPipeline getPipeline() throws Exception {
- return Channels.pipeline(new HelloClientHandler());
- }
- });
- // 連接到本地的8000端口的服務端
- bootstrap.connect(new InetSocketAddress(
- "127.0.0.1", 8000));
- }
- private static class HelloClientHandler extends SimpleChannelHandler {
- /**
- * 當綁定到服務端的時候觸發,打印"Hello world, I'm client."
- *
- * @alia OneCoder
- * @author lihzh
- */
- @Override
- public void channelConnected(ChannelHandlerContext ctx,
- ChannelStateEvent e) {
- System.out.println("Hello world, I'm client.");
- }
- }
- }
優秀的設計----事件驅動
優秀的設計----線程模型