netty mysql 驱动_Netty 5 官网例子

本文详细介绍了如何利用Netty框架构建一个简单的TCP服务,以模拟MySQL驱动的通信过程。通过TimeDecoder、TimeEncoder、TimeServerHandler和TimeClientHandler等类,展示了Netty在处理异步网络通信中的应用。
摘要由CSDN通过智能技术生成

Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

体系结构图

71dda89c21ad17052e8f67fe7508cb80.png

官网中整合代码块之后的完整例子。

TimeDecoder.java

import io.netty.buffer.ByteBuf;

import io.netty.channel.ChannelHandlerContext;

import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class TimeDecoder extends ByteToMessageDecoder { // (1)

@Override

protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) { // (2)

if (in.readableBytes() < 4) {

return; // (3)

}

// out.add(in.readBytes(4)); // (4)

out.add(new UnixTime(in.readInt()));

}

}

TimeEncoder.java

import io.netty.buffer.ByteBuf;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelPromise;

public class TimeEncoder extends ChannelHandlerAdapter {

@Override

public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {

UnixTime m = (UnixTime) msg;

ByteBuf encoded = ctx.alloc().buffer(4);

encoded.writeInt(m.value());

ctx.write(encoded, promise); // (1)

}

}

TimeServerHandler.java

import io.netty.buffer.ByteBuf;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelFutureListener;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

public class TimeServerHandler extends ChannelHandlerAdapter {

@Override

public void channelActive(final ChannelHandlerContext ctx) { // (1)

final ByteBuf time = ctx.alloc().buffer(4); // (2)

time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));

final ChannelFuture f = ctx.writeAndFlush(time); // (3)

f.addListener(new ChannelFutureListener() {

@Override

public void operationComplete(ChannelFuture future) {

assert f == future;

ctx.close();

}

}); // (4)

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

cause.printStackTrace();

ctx.close();

}

}

UnixTime.java

import java.util.Date;

public class UnixTime {

private final int value;

public UnixTime() {

this((int) (System.currentTimeMillis() / 1000L + 2208988800L));

}

public UnixTime(int value) {

this.value = value;

}

public int value() {

return value;

}

@Override

public String toString() {

return new Date((value() - 2208988800L) * 1000L).toString();

}

}

TimeClientHandler.java

import io.netty.buffer.ByteBuf;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

import java.util.Date;

public class TimeClientHandler extends ChannelHandlerAdapter {

private ByteBuf buf;

@Override

public void handlerAdded(ChannelHandlerContext ctx) {

buf = ctx.alloc().buffer(4); // (1)

}

@Override

public void handlerRemoved(ChannelHandlerContext ctx) {

buf.release(); // (1)

buf = null;

}

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) {

ByteBuf m = (ByteBuf) msg;

buf.writeBytes(m); // (2)

m.release();

if (buf.readableBytes() >= 4) { // (3)

long currentTimeMillis = (buf.readInt() - 2208988800L) * 1000L;

System.out.println(new Date(currentTimeMillis));

ctx.close();

}

}

// @Override

// public void channelRead(ChannelHandlerContext ctx, Object msg) {

// UnixTime m = (UnixTime) msg;

// System.out.println(m);

// ctx.close();

// }

// @Override

// public void channelRead(ChannelHandlerContext ctx, Object msg) {

// ByteBuf m = (ByteBuf) msg; // (1)

// try {

// long currentTimeMillis = (m.readUnsignedInt() - 2208988800L) * 1000L;

// System.out.println(new Date(currentTimeMillis));

// ctx.close();

// } finally {

// m.release();

// }

// }

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

cause.printStackTrace();

ctx.close();

}

}

DiscardServerHandler.java

import io.netty.buffer.ByteBuf;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

/**

* Handles a server-side channel.

*/

public class DiscardServerHandler extends ChannelHandlerAdapter { // (1)

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) { // (2)

// Discard the received data silently.

((ByteBuf) msg).release(); // (3)

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4)

// Close the connection when an exception is raised.

cause.printStackTrace();

ctx.close();

}

}

Application

DiscardServer.java

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;

/**

* Discards any incoming data.

*/

public class DiscardServer {

private int port;

public DiscardServer(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(

new DiscardServerHandler());

}

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

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

// Bind and start to accept incoming connections.

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

// Wait until the server socket is closed.

// In this example, this does not happen, but you can do that to

// gracefully

// shut down your server.

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 DiscardServer(port).run();

}

}

TimeClient.java

import io.netty.bootstrap.Bootstrap;

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.NioSocketChannel;

public class TimeClient {

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

String host = "";

int port;

if (args.length > 0) {

host = args[0];

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

} else {

host = "127.0.0.1";

port = 8080;

}

EventLoopGroup workerGroup = new NioEventLoopGroup();

try {

Bootstrap b = new Bootstrap(); // (1)

b.group(workerGroup); // (2)

b.channel(NioSocketChannel.class); // (3)

b.option(ChannelOption.SO_KEEPALIVE, true); // (4)

b.handler(new ChannelInitializer() {

@Override

public void initChannel(SocketChannel ch) throws Exception {

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

}

});

// Start the client.

ChannelFuture f = b.connect(host, port).sync(); // (5)

// Wait until the connection is closed.

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

} finally {

workerGroup.shutdownGracefully();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值