gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:50:40 26 4
gpt4 key购买 nike

我已经查看 Netty javadoc 好几个小时了,但我仍然无法理解这一点。如何打开一个普通的旧 TCP 连接,例如到 IRC 服务器,在 Netty 中?

最佳答案

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();
}


}

关于java - 如何在 Netty 中打开 TCP 连接(客户端)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43476643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com