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

2019-03-11  本文已影响0人  SuperEngCoding

背景

客户端代码

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();
    }

总结

上一篇下一篇

猜你喜欢

热点阅读