0

JAVA分享篇(27)基础知识大总结

 1 year ago
source link: https://www.laiketui.com/103339.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

JAVA分享篇(27)基础知识大总结

行业动态 2023年1月9日 17:25 7

启动类
package cn.itsource.provider;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;

/**
* @author : pankun
* @Version : 1.0
**/
public class RpcServer {

// 暴露端口
private int port;

public RpcServer(int port){
this.port = port;
}

/**
* 开启服务接口监听
* 调用 netty 相关API实现接口监听
*/
public void listen(){
// Boss线程 (Selector核心)
NioEventLoopGroup boss = new NioEventLoopGroup();
// Work线程 (工作线程)
NioEventLoopGroup work = new NioEventLoopGroup();

// 1. 建立服务
ServerBootstrap server = new ServerBootstrap();
// 2. 注入 Boos/Worker
server.group(boss,work)
.channel(NioServerSocketChannel.class) // 3. 管道执行 keys 轮询的核心
.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel channel) throws Exception {
// 5. 对流数据进行解析
ChannelPipeline pipeline = channel.pipeline();
// 6. 自定义协议解码器 (取决于自己定义的规则对象)
/** 入参有5个,分别解释如下
* maxFrameLength:框架的最大长度。如果帧的长度大于此值,则将抛出TooLongFrameException。
* lengthFieldOffset:长度字段的偏移量:即对应的长度字段在整个消息数据中得位置
* lengthFieldLength:长度字段的长度。如:长度字段是int型表示,那么这个值就是4(long型就是8)
* lengthAdjustment:要添加到长度字段值的补偿值
* initialBytesToStrip:从解码帧中去除的第一个字节数
*/
pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
//自定义协议编码器
pipeline.addLast(new LengthFieldPrepender(4));
// 7. 参数解析
//对象参数类型编码器
pipeline.addLast(“encoder”,new ObjectEncoder());
//对象参数类型解码器
pipeline.addLast(“decoder”,new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null)));
// 8. 执行业务逻辑
pipeline.addLast(new RpcServerHandler());
}
}) // 4. 子线程 执行对应的业务逻辑
.option(ChannelOption.SO_BACKLOG,128) // 主线程最大连接数
.childOption(ChannelOption.SO_KEEPALIVE,true); // 子线程持续

try {
// 服务绑定端口
ChannelFuture future = server.bind(port).sync();
System.out.println(“RPC start success, listen port is :” + port + ” !!”);
future.channel().closeFuture().sync(); // 回调
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
boss.shutdownGracefully();
work.shutdownGracefully();
}
}

public static void main(String[] args) {
// 监听启动
new RpcServer(8082).listen();
}

}
免责声明:部分文章信息来源于网络以及客户意见反馈,本站只负责对文章进行整理、排版、编辑,出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性,如本站文章和转稿涉及版权等问题,请作者在及时联系本站,我们会尽快联系您处理


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK