mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-08-06 16:25:28 +00:00
feat[ws]: ssl websocket server
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user