經過上面兩篇文章,你們基本瞭解了一個netty的樣子,爲了專一介紹,特地省去了客戶端的編寫,使用telnet來當作客戶端,而且傳輸的都是文字信息。文字信息侷限比較大,因此開始瞭解客戶端的編寫。服務器
public void bind(String ip, int port) { EventLoopGroup worker = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(worker).channel(NioSocketChannel.class).handler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel ch) throws Exception { ch.pipeline().addLast(new StringEncoder()); } }); ChannelFuture connect = b.connect(ip, port); connect.sync(); connect.channel().writeAndFlush("hello"); connect.channel().close(); } catch (Exception e) { e.printStackTrace(); } finally { worker.shutdownGracefully(); } }
上面的代碼就是客戶端代碼,乍一看還都挺熟悉的,和服務端的代碼很類似。這裏用到了StringEncoder,若是看了上篇的decoder,就很容易猜到了此次的encoder,decoder是在處理byte數組到對象的過程,encoder就是處理對象到byte數組的過程。StringEncoder也是netty提供好的類,專門用來處理字符串。框架
connect.sync();
上面的這個代碼須要注意,connect也是一個異步的操做,下面想發消息,起碼也得等到鏈接建立成功的,不少例子通常不寫這句話,是由於他的邏輯,已經能知足connect成功了,通常邏輯仍是要保證前後的。異步
框架使用代碼自己沒有什麼能夠講的,咱們就作一個對比,方便代碼的記憶。ide
- | 客戶端 | 服務器端 |
---|---|---|
EventLoopGroup個數 | 1 | 2 |
工廠類 | NioSocketChannel | NioServerSocketChannel |
啓動類 | Bootstrap | ServerBootstrap |
綁定方法 | connect | bind |
畢竟是框架代碼,經常使用的話,必須是能夠直接寫出來的,而不是複製粘貼。 個人方法是隻去記憶服務端代碼,你只要能寫出來,那麼客戶端根據不一樣點編寫。明顯你們發現,啓動類和工廠類的區別就是有server和沒有server的區別。並且客戶端確定是要作connect操做的,服務器端確定是要作bind操做的。加上這樣的常識。基本能夠很快就寫出一個客戶端代碼。oop