《Netty》4.实现自己的EchoClient
Posted 申码er
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Netty》4.实现自己的EchoClient相关的知识,希望对你有一定的参考价值。
编写Echo Client
@ChannelHandler.Sharable
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
/**
* 在与服务器建立连接后调用
*/
@Override
public void channelActive(ChannelHandlerContext ctx) {
//当客户端与服务端建立连接后,向服务端发送的内容
ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8));
}
/**
* 当从服务器接收到消息时调用,每当接收到数据时,就会调用此方法。
* 服务器发送的消息可能是分批接收的,如果服务器发送了5个字节,就不能保证一次性接收到所有5个字节。
* 即使是这样少量的数据,也可以调用channelRead0()方法两次,
* 第一次使用ByteBuf (Netty的字节容器)保存3个字节,第二次使用ByteBuf保存2个字节。
* 作为一种面向流的协议,TCP保证将按照服务器发送字节的顺序接收字节。
*/
@Override
public void channelRead0(ChannelHandlerContext ctx, ByteBuf in) {
//接收服务端向客户端发送的内容
System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));
}
/**
* 在处理过程中引发异常时调用
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
public abstract class SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
boolean release = true;
try {
if (acceptInboundMessage(msg)) {
@SuppressWarnings("unchecked")
I imsg = (I) msg;
//调用我们自己的实现
channelRead0(ctx, imsg);
} else {
release = false;
ctx.fireChannelRead(msg);
}
} finally {
if (autoRelease && release) {
//释放内存引用
ReferenceCountUtil.release(msg);
}
}
}
}
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
/**
* 每一个接收到的消息
*
* @param ctx 上下文
* @param msg 消息体
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf in = (ByteBuf) msg;
//打印服务端接收到的消息到控制台
System.out.println("Server received: " + in.toString(CharsetUtil.UTF_8));
//将接收到的消息写入发送方,但不刷新出站消息
ctx.write(in);
}
/**
* 当最后一次调用channelRead()后,触发的后续操作
*
* @param ctx 上下文
*/
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
//将已经写入的消息刷新到客户端并关闭通道
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
}
public class EchoClient {
public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NiosocketChannel.class)
.remoteAddress(new InetSocketAddress("127.0.0.1", 9999))
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new EchoClientHandler());
}
});
ChannelFuture f = b.connect().sync();
f.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
}
}
以上是关于《Netty》4.实现自己的EchoClient的主要内容,如果未能解决你的问题,请参考以下文章
netty源码解解析(4.0)-16 ChannelHandler概览
netty : websocketx.WebSocketHandshakeException: not a WebSocket handshake request: missing upgrade(代
EchoServer和EchoClient模型的改进1之多线程