我一直在看Netty javadocs几个小时,我仍然无法弄明白这一点。如何打开普通的旧TCP连接,例如到Netty的IRC服务器?
答案 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();
}
然后我发送“你好”并回复相同的单词。
这是我的客户端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();
}
}