From 9be2861921a91fe4811eca0ceb6bfaeaed772242 Mon Sep 17 00:00:00 2001 From: wzp Date: Wed, 31 Jul 2024 03:59:19 +0800 Subject: [PATCH] feat: adding handshake connection handler feat: finish connection handler --- src/main/java/cn/wzpmc/Main.java | 2 +- .../wzpmc/network/HandshakePacketHandler.java | 35 +++++++++++++++++++ .../java/cn/wzpmc/network/PacketHandler.java | 20 +++-------- .../network/WebSocketChannelInitializer.java | 4 ++- .../network/WebSocketConnectionHandler.java | 6 ++-- 5 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 src/main/java/cn/wzpmc/network/HandshakePacketHandler.java diff --git a/src/main/java/cn/wzpmc/Main.java b/src/main/java/cn/wzpmc/Main.java index 4019b42..e1ebe9f 100644 --- a/src/main/java/cn/wzpmc/Main.java +++ b/src/main/java/cn/wzpmc/Main.java @@ -37,6 +37,6 @@ public class Main { WebSocketConnectionHandler webSocketConnectionHandler = new WebSocketConnectionHandler(); ChannelFuture future = webSocketConnectionHandler.connect(uri); Channel channel = future.sync().channel(); - log.info("连接服务器成功!"); + } } \ No newline at end of file diff --git a/src/main/java/cn/wzpmc/network/HandshakePacketHandler.java b/src/main/java/cn/wzpmc/network/HandshakePacketHandler.java new file mode 100644 index 0000000..a97df52 --- /dev/null +++ b/src/main/java/cn/wzpmc/network/HandshakePacketHandler.java @@ -0,0 +1,35 @@ +package cn.wzpmc.network; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +/** + * 握手包处理器 + * @author wzp + * @version 0.0.1-dev + * @since 2024/7/31 上午3:53 + */ +@Log4j2 +@RequiredArgsConstructor +public class HandshakePacketHandler extends SimpleChannelInboundHandler { + private final WebSocketClientHandshaker handshaker; + + @Override + public void channelActive(ChannelHandlerContext ctx) { + log.debug("开始WebSocket握手"); + this.handshaker.handshake(ctx.channel()); + log.debug("发送握手包"); + } + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, FullHttpResponse fullHttpResponse) { + if (!handshaker.isHandshakeComplete()) { + handshaker.finishHandshake(channelHandlerContext.channel(), fullHttpResponse); + log.debug("握手成功"); + log.info("连接服务器成功!"); + } + } +} diff --git a/src/main/java/cn/wzpmc/network/PacketHandler.java b/src/main/java/cn/wzpmc/network/PacketHandler.java index 3ebcad7..c2be5c0 100644 --- a/src/main/java/cn/wzpmc/network/PacketHandler.java +++ b/src/main/java/cn/wzpmc/network/PacketHandler.java @@ -2,30 +2,20 @@ package cn.wzpmc.network; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; -import io.netty.handler.codec.http.websocketx.WebSocketFrame; -import lombok.RequiredArgsConstructor; +import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import lombok.extern.log4j.Log4j2; /** + * websocket包处理器 * @author wzp * @version 0.0.1-dev * @since 2024/7/31 上午12:14 */ @Log4j2 -@RequiredArgsConstructor -public class PacketHandler extends SimpleChannelInboundHandler { - private final WebSocketClientHandshaker handshaker; +public class PacketHandler extends SimpleChannelInboundHandler { @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - log.debug("开始WebSocket握手"); - this.handshaker.handshake(ctx.channel()); - log.debug("握手完成"); - } - - @Override - protected void channelRead0(ChannelHandlerContext channelHandlerContext, WebSocketFrame webSocketFrame) throws Exception { - System.out.println(webSocketFrame); + protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame webSocketFrame) { + log.info(webSocketFrame.text()); } } diff --git a/src/main/java/cn/wzpmc/network/WebSocketChannelInitializer.java b/src/main/java/cn/wzpmc/network/WebSocketChannelInitializer.java index 8b33461..e0470a7 100644 --- a/src/main/java/cn/wzpmc/network/WebSocketChannelInitializer.java +++ b/src/main/java/cn/wzpmc/network/WebSocketChannelInitializer.java @@ -18,12 +18,14 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class WebSocketChannelInitializer extends ChannelInitializer { private final ChannelHandler handler; + private final HandshakePacketHandler handshakePacketHandler; @Override - protected void initChannel(SocketChannel socketChannel) throws Exception { + protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new HttpClientCodec()); pipeline.addLast(new ChunkedWriteHandler()); pipeline.addLast(new HttpObjectAggregator(64 * 1024)); + pipeline.addLast(handshakePacketHandler); pipeline.addLast(handler); } } diff --git a/src/main/java/cn/wzpmc/network/WebSocketConnectionHandler.java b/src/main/java/cn/wzpmc/network/WebSocketConnectionHandler.java index d96b026..094b30e 100644 --- a/src/main/java/cn/wzpmc/network/WebSocketConnectionHandler.java +++ b/src/main/java/cn/wzpmc/network/WebSocketConnectionHandler.java @@ -12,7 +12,6 @@ import io.netty.handler.codec.http.websocketx.WebSocketVersion; import lombok.extern.log4j.Log4j2; import java.net.URI; -import java.util.concurrent.Future; /** * 此类用于建立WebSocket连接 @@ -33,8 +32,9 @@ public class WebSocketConnectionHandler { log.info("正在连接websocket"); Bootstrap bootstrap = new Bootstrap(); WebSocketClientHandshaker clientHandshaker = WebSocketClientHandshakerFactory.newHandshaker(websocket, WebSocketVersion.V13, null, false, new DefaultHttpHeaders()); - PacketHandler handler = new PacketHandler(clientHandshaker); - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class).handler(new WebSocketChannelInitializer(handler)); + HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(clientHandshaker); + PacketHandler handler = new PacketHandler(); + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class).handler(new WebSocketChannelInitializer(handler, handshakePacketHandler)); return bootstrap.connect(websocket.getHost(), websocket.getPort()); }