经过上面两篇文章,你们基本了解了一个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