從零開始學netty——第一個netty程序

說在前面的事

本身學習用netty以前有不少的疑惑,這裏先把本身的疑惑與答案寫出來,但願能夠幫到有一樣疑惑的朋友。java

問題:netty版本的選擇,3,4,5。
答案:3和4的改動挺大,可是4和5的不大,如今官方給的版本是4,原本是有5的,結果下架了,可是能夠在不少maven庫中找到5。全部人都但願本身所學的內容生命週期長點,並不想剛學完就會廢棄掉。我推薦的版本是4。跟着官方走。
問題:netty的書的選擇
答案:我看了幾本,最後認爲《netty權威指南》不錯,他的知識點比較全面,可能入手去讀得有必定的基礎,不然在讀IO模型的時候不少人就糊塗了。這本書是基於5講的,我仍是推薦,主要4和5變更不大。變更的部分仍是能夠接受的。
問題:學netty必定要會用java IO ,NIO嗎
答案:netty做爲一個框架,就是屏蔽這些複雜操做的,因此是不須要特別精通java的部分,並且netty提供了本身的包裝類。若是是入手學習這個框架,我認爲是能夠不用的,可是基本的socket編程基礎是須要的。主要是會必定socket基礎,能夠有一個良好的邏輯思惟,要不你都不知道框架是幹啥的。後面想繼續閱讀源碼,那就須要把這些知識都補充起來。 問題:netty的優點編程

開始程序

從socket分析入手

你們都知道socket傳輸和語言無關,和機器無關(固然,大端機器和小端機器讀取的結果不同須要特殊處理一下,可是全部機器均可以接收)。因此咱們的程序不寫客戶端,用系統自帶的telnet來作客戶端訪問。咱們只寫服務端。框架

服務端分析

寫過socket程序都知道,服務端的socket是有幾個通用操做的,例如accept,read,write。咱們此次也主要圍繞這幾個來對比的看。socket

public void bind(int port) {
		EventLoopGroup boss = new NioEventLoopGroup();
		EventLoopGroup worker = new NioEventLoopGroup();
		try {
			ServerBootstrap server = new ServerBootstrap();
			server.group(boss, worker).channel(NioServerSocketChannel.class)
					.childHandler(new ChannelInitializer<Channel>() {

						@Override
						protected void initChannel(Channel ch) throws Exception {

							ch.pipeline().addLast(new MessageHandler());
						}

					});

			ChannelFuture sync = server.bind(port).sync();
			sync.channel().closeFuture().sync();
		} catch (InterruptedException e) {

			e.printStackTrace();
		} finally {
			boss.shutdownGracefully();
			worker.shutdownGracefully();
		}

	}

上面這段代碼爲何要這麼寫,建議你們先不考慮這個問題,就先這麼寫。做爲一個server端的編寫,咱們主要在意的是端口。不管什麼框架,什麼模型,socket的主要都是port,惟一咱們須要寫的業務就是MessageHandlermaven

public class MessageHandler extends ChannelInboundHandlerAdapter{

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

		ByteBuf buf =(ByteBuf)msg;
		int readableBytes = buf.readableBytes();
		byte[] bytes =new byte[readableBytes];
		buf.readBytes(bytes);
		
		System.out.println(new String(bytes));
		
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		System.out.println("connection");

	}
	

}

這裏我從新了兩個方法,一個是channelRead,一個是channelActive。很明顯的對應我上面說的accpet和read。這裏不少人問爲何msg必定是用byte來接收呢。這個其實和協議有關,不過我建議你們先想一想普通socket編程你獲取的不是inputstream和outputstream嗎,他們自己就是處理字節流的。因此這裏也是同樣的。處理字節流。ide

telnet的使用

不少人學socket的時候都是本身寫客戶端,本身寫服務端。因此大概介紹一下telnet的使用。oop

telnet ip port ctrl + ] 進入命令發消息模式 send hello 這樣就會把hello發送出去學習

框架的使用

你們經過上面的介紹必定能夠完成程序,而且能夠收到telnet發送的結果,只是感受用了半天,其實啥也不知道,由於netty的事情我一句沒說。這也是我最開始學習框架遇到的問題,心裏實際上是不知足會用的層次的,總想知道原理,爲何這麼用,最後花掉了大部分的時間進去,結果是原理是不錯了,但是框架自己用法上沒有怎麼感覺,因此如今我想你們的思惟能夠換一換,更關注業務,先會用,再說爲啥用。netty

相關文章
相關標籤/搜索