netty java_Netty使用示例

本文档展示了如何使用Netty构建一个简单的Echo服务。包括服务器端(EchoServer)和客户端(EchoClient)的实现,涉及到ChannelInitializer、DelimiterBasedFrameDecoder、StringDecoder、StringEncoder等组件的使用,实现了数据的发送与接收。
摘要由CSDN通过智能技术生成

下面列举一个最简单的 echo 服务

服务器

EchoServer.java

package cn.gameboys.netty.demo.echo;

import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioServerSocketChannel;

import io.netty.handler.codec.DelimiterBasedFrameDecoder;

import io.netty.handler.codec.Delimiters;

import io.netty.handler.codec.string.StringDecoder;

import io.netty.handler.codec.string.StringEncoder;

/**

* 应答服务器

*/

public class EchoServer {

private int port;

public EchoServer(int port) {

this.port = port;

}

public void run() throws Exception {

EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)

EventLoopGroup workerGroup = new NioEventLoopGroup();

try {

ServerBootstrap b = new ServerBootstrap(); // (2)

b.group(bossGroup, workerGroup)

.channel(NioServerSocketChannel.class) // (3)

.childHandler(new ChannelInitializer() { // (4)

@Override

public void initChannel(SocketChannel ch) throws Exception {

ch.pipeline().addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));

ch.pipeline().addLast("decoder", new StringDecoder());

ch.pipeline().addLast("encoder", new StringEncoder());

ch.pipeline().addLast(new EchoServerHandler());

}

})

.option(ChannelOption.SO_BACKLOG, 128)          // (5)

.childOption(ChannelOption.SO_KEEPALIVE, true); // (6)

// 绑定端口,开始接收进来的连接

ChannelFuture f = b.bind(port).sync(); // (7)

System.out.println("Server start listen at " + port );

// 等待服务器  socket 关闭 。

// 在这个例子中,这不会发生,但你可以优雅地关闭你的服务器。

f.channel().closeFuture().sync();

} finally {

workerGroup.shutdownGracefully();

bossGroup.shutdownGracefully();

}

}

public static void main(String[] args) throws Exception {

int port;

if (args.length > 0) {

port = Integer.parseInt(args[0]);

} else {

port = 8080;

}

new EchoServer(port).run();

}

}

EchoServerHandler.java

package cn.gameboys.netty.demo.echo;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;

import io.netty.util.concurrent.Future;

import io.netty.util.concurrent.GenericFutureListener;

/**

* 处理服务端 channel.

*/

public class EchoServerHandler extends ChannelInboundHandlerAdapter {

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) {

System.out.println(ctx.channel().remoteAddress()+"->Server :"+ msg.toString());

ctx.write(msg); // (1)

ChannelFuture future= ctx.channel().write(msg);

future.addListener(new GenericFutureListener>() {

@Override

public void operationComplete(Future super Void> future) throws Exception {

System.out.println("asdf");

}

});

ctx.flush(); // (2)

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

// 当出现异常就关闭连接

cause.printStackTrace();

ctx.close();

}

}

客户端

EchoClient.java

package cn.gameboys.netty.demo.echo;

import io.netty.bootstrap.Bootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.ChannelPipeline;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;

import io.netty.handler.codec.DelimiterBasedFrameDecoder;

import io.netty.handler.codec.Delimiters;

import io.netty.handler.codec.string.StringDecoder;

import io.netty.handler.codec.string.StringEncoder;

/**

* Sends one message when a connection is open and echoes back any received

* data to the server.  Simply put, the echo client initiates the ping-pong

* traffic between the echo client and server by sending the first message to

* the server.

*/

public final class EchoClient {

static final String HOST = System.getProperty("host", "127.0.0.1");

static final int PORT = Integer.parseInt(System.getProperty("port", "8080"));

static final int SIZE = Integer.parseInt(System.getProperty("size", "256"));

public static void main(String[] args) throws Exception {

// Configure the client.

EventLoopGroup group = new NioEventLoopGroup();

try {

Bootstrap b = new Bootstrap();

b.group(group)

.channel(NioSocketChannel.class)

.option(ChannelOption.TCP_NODELAY, true)

.handler(new ChannelInitializer() {

@Override

public void initChannel(SocketChannel ch) throws Exception {

ChannelPipeline p = ch.pipeline();

p.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));

p.addLast("decoder", new StringDecoder());

p.addLast("encoder", new StringEncoder());

p.addLast(new EchoClientHandler());

}

});

// Start the client.

ChannelFuture f = b.connect(HOST, PORT).sync();

// Wait until the connection is closed.

f.channel().closeFuture().sync();

} finally {

// Shut down the event loop to terminate all threads.

group.shutdownGracefully();

}

}

}

EchoClientHandler.java

package cn.gameboys.netty.demo.echo;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;

public class EchoClientHandler extends ChannelInboundHandlerAdapter {

private final ByteBuf firstMessage;

/**

* Creates a client-side handler.

*/

public EchoClientHandler() {

firstMessage = Unpooled.buffer(EchoClient.SIZE);

for (int i = 0; i 

firstMessage.writeByte((byte) i);

}

}

@Override

public void channelActive(ChannelHandlerContext ctx) {

ctx.writeAndFlush(firstMessage);

}

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) {

ctx.write(msg);

}

@Override

public void channelReadComplete(ChannelHandlerContext ctx) {

ctx.flush();

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {         // Close the connection when an exception is raised.

cause.printStackTrace();

ctx.close();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值