传递外部数据进入netty并发送出去(2)

思路一相对来说有点复杂,而且总感觉不太安全。

那么也讲一下思路二吧:client.java中有一个方法叫做channelFuture,利用它可以直接获取到channel,而channel和ctx是一一对应的并且也能够writeandFlush();那么我们只要在client内部定义一个private channel,并由构建连接时所用的channelFuture来生成这个channel不也行?然后再自定义一个public方法用于处理外部传进来的数据不就好了。

做法:其实感觉思路里面就已经把做法讲完了。。。还是贴一下代码吧

public class client {
    public clientHandler cl=new clientHandler();//这是方法一的
    private Channel channel;//方法二定义的channel
    public void start(String host,int port) throws Exception {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group) // 注册线程池
                    .channel(NioSocketChannel.class) // 使用NioSocketChannel来作为连接用的channel类
                    .option(ChannelOption.TCP_NODELAY, true)
                    .handler(new ChannelInitializer<SocketChannel>() { // 绑定连接初始化器
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            System.out.println("connected...");
                            ch.pipeline().addLast(new ProtobufVarint32LengthFieldPrepender());
                            ch.pipeline().addLast(new ProtobufEncoder());
                            ch.pipeline().addLast(cl);
                        }
                    });
            ChannelFuture f = b.connect(host, port).sync();//就是使用这儿的channelFuture啦
            System.out.println("connected...over"); // 连接完成

            channel=f.channel();//赋值完成
            f.channel().closeFuture().sync(); // 异步等待关闭连接channel
            System.out.println("closed.."); // 关闭完成
        } finally {
            group.shutdownGracefully().sync(); // 释放线程池资源
        }
    }
    public void sendMessage(Data msg) throws Exception {//自定义的一个方法,只要在外部调用该方法就行啦;Data是我自己定义的数据类型不用管
        channel.writeAndFlush(msg);
    }
}

剩下的就是在外部的datasend.java内部直接调用sendMessge(Data data)就行啦





。。。。。本来以为自己先想到的,结果逛逛百度竟然找到一篇一样思路的。。。。

贴个链接吧,感觉别人写的比我好

阅读更多

没有更多推荐了,返回首页