java WebSocket客户端基于Netty代码实现

版权声明:https://blog.csdn.net/qq_33249725 https://blog.csdn.net/qq_33249725/article/details/88389063

背景

  • 最近接了一个任务对接WS的服务端,从网上找了一些案例,都不能实际的去用到工作当中,根据自己的摸索写了以下代码完成了对接工作,话不多说直接上代码。

客户端代码

EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        try {
            URI uri = new URI("ws://192.168.50.xx:xx/xx/xx");
            Bootstrap bootstrap = new Bootstrap();
            MockClientHandler webSocketClientHandler = new MockClientHandler(
                    WebSocketClientHandshakerFactory.newHandshaker(uri
                            , WebSocketVersion.V13
                            , null
                            , false
                            , new DefaultHttpHeaders()));
            bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class).
                    handler(new MockClientInitializer(webSocketClientHandler));
            Channel channel = bootstrap.connect(uri.getHost(), uri.getPort()).sync().channel();
            channel.closeFuture().sync();
        } catch (InterruptedException | URISyntaxException e) {
            log.error("socket连接异常:{}",e);
            e.printStackTrace();
        } finally {
            eventLoopGroup.shutdownGracefully();
        }

初始化通道

public class MockClientInitializer extends ChannelInitializer<SocketChannel> {
    private MockClientHandler mockClientHandler;

    MockClientInitializer(MockClientHandler mockClientHandler) {
        this.mockClientHandler = mockClientHandler;
    }

    @Override
    protected void initChannel(SocketChannel channel)  {
        ChannelPipeline pipeline = channel.pipeline();
        // 将请求与应答消息编码或者解码为HTTP消息
        pipeline.addLast(new HttpClientCodec());
        pipeline.addLast(new LoggingHandler(LogLevel.INFO));
        pipeline.addLast("decoder", new StringDecoder());
        pipeline.addLast("encoder", new StringEncoder());
        // 客户端Handler
        pipeline.addLast("handler", mockClientHandler);
    }
}

消息处理类

@Slf4j
public class MockClientHandler extends SimpleChannelInboundHandler<String> {

    private MsgHandleService msgHandleService;

    private final WebSocketClientHandshaker webSocketClientHandshaker;

    public MockClientHandler(WebSocketClientHandshaker webSocketClientHandshaker) {
        this.webSocketClientHandshaker = webSocketClientHandshaker;
        this.msgHandleService = SpringContextHolder.getBean(MsgHandleService.class);
    }

    /**
     * 当客户端主动链接服务端的链接后,调用此方法
     *
     * @param channelHandlerContext ChannelHandlerContext
     */
    @Override
    public void channelActive(ChannelHandlerContext channelHandlerContext) {
        log.info("\n\t⌜⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓\n" +
                "\t├ [Mock 建立连接]\n" +
                "\t⌞⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓");

        Channel channel = channelHandlerContext.channel();
        // 握手
        webSocketClientHandshaker.handshake(channel);
    }


    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String data) {
        log.info("接收到客户端的响应为:{}", data);
       //自定义处理消息
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        log.info("\n\t⌜⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓\n" +
                "\t├ [exception]: {}\n" +
                "\t⌞⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓", cause.getMessage());
        ctx.close();
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) {
        System.out.println("与服务器端断开连接");
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext channelHandlerContext) {
        channelHandlerContext.flush();
    }

总结

  • 到此代码已经完毕,希望能够帮忙各位小伙伴。

重连机制

猜你喜欢

转载自blog.csdn.net/qq_33249725/article/details/88389063