feat[ws]: ssl websocket server

This commit is contained in:
godotg
2023-04-16 11:13:48 +08:00
parent 12a1631a5b
commit 64029813e3
2 changed files with 22 additions and 15 deletions
@@ -19,7 +19,6 @@ import com.zfoo.net.handler.codec.websocket.WebSocketCodecHandler;
import com.zfoo.net.handler.idle.ServerIdleHandler;
import com.zfoo.net.session.Session;
import com.zfoo.protocol.IPacket;
import com.zfoo.protocol.exception.ExceptionUtils;
import com.zfoo.protocol.util.IOUtils;
import com.zfoo.util.net.HostAndPort;
import io.netty.channel.socket.SocketChannel;
@@ -30,8 +29,6 @@ import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.IdleStateHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.Nullable;
import javax.net.ssl.SSLException;
@@ -44,8 +41,6 @@ import java.util.function.BiFunction;
*/
public class WebsocketSslGatewayServer extends AbstractServer<SocketChannel> {
private static final Logger logger = LoggerFactory.getLogger(WebsocketSslGatewayServer.class);
private SslContext sslContext;
private BiFunction<Session, IPacket, Boolean> packetFilter;
@@ -55,7 +50,7 @@ public class WebsocketSslGatewayServer extends AbstractServer<SocketChannel> {
try {
this.sslContext = SslContextBuilder.forServer(pem, key).build();
} catch (SSLException e) {
logger.error(ExceptionUtils.getMessage(e));
throw new IllegalArgumentException(e);
}
this.packetFilter = packetFilter;
}
@@ -14,15 +14,23 @@
package com.zfoo.net.core.websocket;
import com.zfoo.net.core.AbstractServer;
import com.zfoo.net.handler.GatewayRouteHandler;
import com.zfoo.net.handler.ServerRouteHandler;
import com.zfoo.net.handler.codec.websocket.WebSocketCodecHandler;
import com.zfoo.net.handler.idle.ServerIdleHandler;
import com.zfoo.protocol.util.IOUtils;
import com.zfoo.util.net.HostAndPort;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.IdleStateHandler;
import javax.net.ssl.SSLException;
import java.io.InputStream;
/**
* @author godotg
@@ -30,22 +38,26 @@ import io.netty.handler.stream.ChunkedWriteHandler;
*/
public class WebsocketSslServer extends AbstractServer<SocketChannel> {
public WebsocketSslServer(HostAndPort host) {
private SslContext sslContext;
public WebsocketSslServer(HostAndPort host, InputStream pem, InputStream key) {
super(host);
try {
this.sslContext = SslContextBuilder.forServer(pem, key).build();
} catch (SSLException e) {
throw new IllegalArgumentException(e);
}
}
@Override
public void initChannel(SocketChannel channel) {
// 编解码 http 请求
protected void initChannel(SocketChannel channel) {
channel.pipeline().addLast(new IdleStateHandler(0, 0, 180));
channel.pipeline().addLast(new ServerIdleHandler());
channel.pipeline().addLast(sslContext.newHandler(channel.alloc()));
channel.pipeline().addLast(new HttpServerCodec(8 * IOUtils.BYTES_PER_KB, 16 * IOUtils.BYTES_PER_KB, 16 * IOUtils.BYTES_PER_KB));
// 聚合解码 HttpRequest/HttpContent/LastHttpContent 到 FullHttpRequest
// 保证接收的 Http 请求的完整性
channel.pipeline().addLast(new HttpObjectAggregator(16 * IOUtils.BYTES_PER_MB));
// 处理其他的 WebSocketFrame
channel.pipeline().addLast(new WebSocketServerProtocolHandler("/websocket"));
// 写文件内容,支持异步发送大的码流,一般用于发送文件流
channel.pipeline().addLast(new WebSocketServerProtocolHandler("/"));
channel.pipeline().addLast(new ChunkedWriteHandler());
// 编解码WebSocketFrame二进制协议
channel.pipeline().addLast(new WebSocketCodecHandler());
channel.pipeline().addLast(new ServerRouteHandler());
}