同样的,基于getty的架构模式,websocket同样以插件的形式支持,使用起来非常简单,与原有插件使用模式保持一致
启动一个ws服务
try {
//初始化配置对象
AioServerConfig aioServerConfig = new AioServerConfig();
//设置host,不设置默认localhost
//aioServerConfig.setHost("127.0.0.1");
//设置端口号
aioServerConfig.setPort(8888);
//设置服务器端内存池最大可分配空间大小,默认256mb,内存池空间可以根据吞吐量设置。
// 尽量可以设置大一点,因为这不会真正的占用系统内存,只有真正使用时才会分配
aioServerConfig.setServerChunkSize(512 * 1024 * 1024);
//设置数据输出器队列大小,一般不用设置这个参数,默认是10*1024*1024
aioServerConfig.setBufferWriterQueueSize(10 * 1024 * 1024);
//设置读取缓存块大小,一般不用设置这个参数,默认128字节
aioServerConfig.setReadBufferSize(2048);
//设置内存池等待分配内存的最大阻塞时间,默认是1秒
aioServerConfig.setChunkPoolBlockTime(1000);
//设置SocketOptions
aioServerConfig.setOption(StandardSocketOptions.SO_RCVBUF, 8192);
AioServerStarter server = new AioServerStarter(aioServerConfig);
server.socketChannel(SocketChannel.TCP).channelInitializer(new ChannelInitializer() {
@Override
public void initChannel(AioChannel channel) throws Exception {
//获取责任链对象
DefaultChannelPipeline defaultChannelPipeline = channel.getDefaultChannelPipeline();
//先把ws的编解码器添加到责任链前面。注意,只有先通过ws的编解码器,才能解析ws的消息帧,
//后续的解码器才能继续解析期望得到的结果
defaultChannelPipeline.addLast(new WebSocketEncoder());
defaultChannelPipeline.addLast(new WebSocketDecoder());
defaultChannelPipeline.addLast(new StringDecoder());
//添加自定义的简单消息处理器
defaultChannelPipeline.addLast(new SimpleHandler());
}
}).start();
System.out.println("启动ws服务");
} catch (Exception e) {
}
开启带ssl的wss服务
try {
//初始化配置对象
AioServerConfig aioServerConfig = new AioServerConfig();
//设置host,不设置默认localhost
//aioServerConfig.setHost("127.0.0.1");
//设置端口号
aioServerConfig.setPort(8888);
//设置服务器端内存池最大可分配空间大小,默认256mb,内存池空间可以根据吞吐量设置。
// 尽量可以设置大一点,因为这不会真正的占用系统内存,只有真正使用时才会分配
aioServerConfig.setServerChunkSize(512 * 1024 * 1024);
//设置数据输出器队列大小,一般不用设置这个参数,默认是10*1024*1024
aioServerConfig.setBufferWriterQueueSize(10 * 1024 * 1024);
//设置读取缓存块大小,一般不用设置这个参数,默认128字节
aioServerConfig.setReadBufferSize(2048);
//设置内存池等待分配内存的最大阻塞时间,默认是1秒
aioServerConfig.setChunkPoolBlockTime(1000);
//设置SocketOptions
aioServerConfig.setOption(StandardSocketOptions.SO_RCVBUF, 8192);
AioServerStarter server = new AioServerStarter(aioServerConfig);
server.socketChannel(SocketChannel.TCP).channelInitializer(new ChannelInitializer() {
@Override
public void initChannel(AioChannel channel) throws Exception {
//获取责任链对象
DefaultChannelPipeline defaultChannelPipeline = channel.getDefaultChannelPipeline();
//获取证书
String pkPath = ResourceUtils.getURL("classpath:serverStore.jks")
.getPath();
//ssl配置
SslConfig sSLConfig = new SslConfig();
sSLConfig.setKeyFile(pkPath);
sSLConfig.setKeyPassword("123456");
sSLConfig.setKeystorePassword("123456");
sSLConfig.setTrustFile(pkPath);
sSLConfig.setTrustPassword("123456");
//设置服务器模式
sSLConfig.setClientMode(false);
//设置单向验证或双向验证
sSLConfig.setClientAuth(ClientAuth.NONE);
//初始化ssl服务
SslService sslService = new SslService(sSLConfig, "TLSv1.2");
//注意,只要使用ssl。都需要把ssl编解码器放到责任链最前面
defaultChannelPipeline.addFirst(new SslHandler(channel, sslService));
//紧跟着把ws的编解码器添加到责任链前面。注意,只有先通过ws的编解码器,才能解析ws的消息帧,
//后续的解码器才能继续解析期望得到的结果
defaultChannelPipeline.addLast(new WebSocketEncoder());
defaultChannelPipeline.addLast(new WebSocketDecoder());
defaultChannelPipeline.addLast(new StringDecoder());
//添加自定义的简单消息处理器
defaultChannelPipeline.addLast(new SimpleHandler());
}
}).start();
System.out.println("启动ws服务");
} catch (Exception e) {
}