简单的Java实现Netty进行通信
2021-01-20 14:13
标签:hand row nios json 包含 对象 tom out request 看过dubbo源码的同学应该都清楚,使用dubbo协议的底层通信是使用的netty进行交互,而最近看了dubbo的Netty部分后,自己写了个简单的Netty通信例子。 本文源地址:实现Netty进行通信 工程截图 模块详解 rpc-common作为各个模块都需使用的模块,工程中出现的是一些通信时请求的参数以及返回的参数,还有一些序列化的工具。 rpc-client中目前只是单单的一个NettyClient启动类。 rpc-client中目前也只是单单的一个NettyServer服务启动类。 需要的依赖 目前所有的依赖项都出现在 rpc-common 下的 pom.xml中。 首先我们在common中先定义本次的Request和Response的基类对象。 使用fastJson进行本次序列化 Netty对象的序列化转换很好懂, 不过如果是有要用到生产上的同学,建议不要使用 NetyServer 关键名词: EventLoopGroup Server端的EventLoopGroup分为两个,一般workerGroup作为处理请求,bossGroup作为接收请求。 ChannelOption 以上四个常量作为TCP连接中的属性。 ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); NettyServerHandler中出现的 NettyClient 测试 如果以上所有内容都准备就绪,那么就可以进行调试了。 启动顺序,先启动NettyServer,再启动NettyClient。 记得刚出来工作时,有工作很多年的同事问我了不了解Netty,当时工作太短,直说听过Putty,现在回想起来真的挺丢人的,哈哈。?? Netty作为通信框架,如果你了解TCP,而且项目中有类似传输信息的需求,又不想集成HTTP或者Socket,那么Netty真的挺实用的。 参考资料: Dubbo-Netty
Netty.io 本项目Github地址:Netty-RPC 简单的Java实现Netty进行通信 标签:hand row nios json 包含 对象 tom out request 原文地址:https://www.cnblogs.com/yanzhenyidai/p/12901527.html使用Java搭建一个简单的Netty通信例子
准备
实现
public class Request {
private String requestId;
private Object parameter;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public Object getParameter() {
return parameter;
}
public void setParameter(Object parameter) {
this.parameter = parameter;
}
}
public class Response {
private String requestId;
private Object result;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
ByteToMessageDecoder
和 MessageToByteEncoder
分别只要继承它们,重写方法后,获取到Object和Byte,各自转换就OK。fastJson
,因为它的漏洞补丁真的是太多了,可以使用google的 protostuff
。public class RpcDecoder extends ByteToMessageDecoder {
// 目标对象类型进行解码
private Class> target;
public RpcDecoder(Class target) {
this.target = target;
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
Request request = (Request) msg;
System.out.println("Client Data:" + JSON.toJSONString(request));
Response response = new Response();
response.setRequestId(request.getRequestId());
response.setResult("Hello Client !");
// client接收到信息后主动关闭掉连接
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.close();
}
}
public class NettyServer {
private static final Logger logger = LoggerFactory.getLogger(NettyServer.class);
private String ip;
private int port;
public NettyServer(String ip, int port) {
this.ip = ip;
this.port = port;
}
public void server() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
final ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.option(ChannelOption.SO_SNDBUF, 32 * 1024)
.option(ChannelOption.SO_RCVBUF, 32 * 1024)
.option(ChannelOption.SO_KEEPALIVE, true)
.childHandler(new ChannelInitializer
ChannelFutureListener.CLOSE
,作为Server端主动关闭与Client端的通信,如果没有主动Close,那么NettyClient将会一直处于阻塞状态,得不到NettyServer的返回信息。
public class NettyClient extends SimpleChannelInboundHandler
总结
文章标题:简单的Java实现Netty进行通信
文章链接:http://soscw.com/index.php/essay/44568.html