如何在Netty中打开TCP连接(客户端)?

时间:2017-04-18 15:43:03

标签: java tcp netty

我一直在看Netty javadocs几个小时,我仍然无法弄明白这一点。如何打开普通的旧TCP连接,例如到Netty的IRC服务器?

1 个答案:

答案 0 :(得分:1)

you can find many demo in github of netty

假设您在服务器中使用netty5。 您应该将解码器编码器添加到管道中。  如下所示

 socketChannel.pipeline().addLast(new StringEncoder() ,new StringDecoder() ,new LineBasedFrameDecoder(1024));

这是我的服务器演示

String  ip ;
int port  = 9999;

NioEventLoopGroup   workGroup = new NioEventLoopGroup(8);
NioEventLoopGroup  bossGroup = new NioEventLoopGroup();
try {
    bootstrap = new ServerBootstrap();
    bootstrap.group(bossGroup, workGroup);
    bootstrap.channel(NioServerSocketChannel.class);
    bootstrap.option(ChannelOption.SO_BACKLOG, 100);
    bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
        @Override
        protected void initChannel(SocketChannel socketChannel) throws Exception {
            socketChannel.pipeline().addLast(new StringEncoder() ,new StringDecoder() ,new LineBasedFrameDecoder(1024));
            socketChannel.pipeline().addLast(new ChannelHandlerAdapter() {
                @Override
                public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
                    System.out.println("the num" +num.getAndIncrement());
                }

                @Override
                public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                    System.out.println("what i say is :" + msg.toString());
                    ctx.channel().writeAndFlush("from server " + "reply message is " +msg.toString()+"\n");

                }
            });
        }
    });
   ChannelFuture future =  bootstrap.bind(port).sync();
    System.out.println("Server start at port : " + port);
    future.channel().closeFuture().sync();
}catch (Exception e){
    System.out.println("error");
}finally {
    bossGroup.shutdownGracefully();
    workGroup.shutdownGracefully();
}


}

然后您可以使用阻塞套接字正常连接它。 这是我的客户端演示。

Socket socket = new Socket();
    try {
        socket.connect(new InetSocketAddress("localhost" , 9999));
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream  = socket.getOutputStream();
        outputStream.write("hello".getBytes());
        outputStream.flush();
        InputStreamReader reader = new InputStreamReader(inputStream) ;
        char [] temChar  = new char[40];
        StringBuffer buffer = new StringBuffer( );

        while (reader.read(temChar) != -1){
            buffer.append(temChar);
            System.out.println(buffer.toString() +"\n");
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

然后我发送“你好”并回复相同的单词。

enter image description here

这是我的客户端netty演示

int port  = 9999;
Bootstrap bootstrap ;
NioEventLoopGroup workGroup = new NioEventLoopGroup(8);



    try {
        bootstrap = new Bootstrap();
        bootstrap.group(workGroup);
        bootstrap.channel(NioSocketChannel.class);
        bootstrap.handler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel socketChannel) throws Exception {
                socketChannel.pipeline().addLast( new StringDecoder() ,new StringEncoder( )  , new LineBasedFrameDecoder(1024), new ChannelHandlerAdapter(){
                    @Override
                    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                        System.out.println("recieve method of client : " +msg.toString());
                    }
                });
            }
        });


       NioSocketChannel nioSocketChannel ;

        ChannelFuture future = bootstrap.connect("localhost" , 9999).sync();

        //you can also invoke writeAndFlush() in other thread with channel ,
        //  it is the same as  server   
        System.out.println("try to write hello");
        Channel  channel = future.channel();
        channel.writeAndFlush("hello\n\r");


        future.channel().closeFuture().sync();   //it will block until 
                                                  //   you invoke 
                                                   //   channel.close(); 




        System.out.println("finish: " + port);

    }catch (Exception e){
        e.printStackTrace();
        System.out.println("error");
    }finally {

        workGroup.shutdownGracefully();
    }


}