快捷导航

springboot整合netty搭建的websocket服务端,握手阻塞

//springboot(version2.0.2)整合netty(version4.1.25)搭建的websocket服务端,握手阻塞,握手成功(handlerAdded调用)但是未返回握手成功信息给前端,//前端websocket握手阻塞,连接超时@Componentpublic class NettySocket {    private static class SingletionSocketServer {        static final NettySocket INSTANCE = new NettySocket();    }    public static NettySocket getInstance() {        return SingletionSocketServer.INSTANCE;    }    private EventLoopGroup parentGroup;    private EventLoopGroup childGroup;    private ServerBootstrap serverBootstrap;    private ChannelFuture future;    public NettySocket() {        parentGroup = new NioEventLoopGroup();        childGroup = new NioEventLoopGroup();        serverBootstrap = new ServerBootstrap();        serverBootstrap.group(parentGroup, childGroup).channel(NioServerSocketChannel.class).childHandler(new NettySocketInitializer());    }    public void start() {        this.future = serverBootstrap.bind(8065);        System.out.println("netty WebSocket start ok");    }}初始化器

public class NettySocketInitializer extends ChannelInitializer {    @Override    protected void initChannel(SocketChannel ch) {        ChannelPipeline channelPipeline = ch.pipeline();        ////////////////http协议的支持    ///////////////        //Http编解码器        channelPipeline.addLast(new HttpServerCodec());        //对写大数据流的支持        channelPipeline.addLast(new ChunkedWriteHandler());        //Http对象聚合器,,参数:消息的最大长度        //几乎在Netty中的编程都会使用到这个handler        channelPipeline.addLast(new HttpObjectAggregator(1024 * 64));        ////////////////http协议的支持 END///////////////        channelPipeline.addLast(new WebSocketServerProtocolHandler("/nt-ws"));        channelPipeline.addLast(new ChatHandler());    }}消息处理

@Slf4jpublic class ChatHandler extends SimpleChannelInboundHandler {    /**     * 记录和管理所有客户端     */    private static ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);    @Override    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {        String content = msg.text();        log.info("accept: {}", content);        for (Channel channel : clients) {            channel.writeAndFlush(new TextWebSocketFrame("服务器消息[" + ctx.channel().id().asLongText() + "]: " + content));        }//            clients.writeAndFlush(new TextWebSocketFrame("服务器消息[" + ctx.channel().id().asLongText() + "]: " + content));    }    @Override    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {        clients.add(ctx.channel());        log.info("客户端连接  ——   channel id : {}", ctx.channel().id().asLongText());        log.info("剩余客户端:{}", clients.size());//            ctx.channel().writeAndFlush(new TextWebSocketFrame("连接成功!当前在线人数:" + clients.size()));    }    @Override    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {        //触发该方法ChannelGroup会自动移除对应客户端的channel,所以不需要专门移除//            clients.remove(ctx.channel());        log.info("客户端连接断开  ——   channel id : {}", ctx.channel().id().asLongText());        log.info("剩余客户端:{}", clients.size());    }    @Override    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {        cause.printStackTrace();        // 发生异常之后关闭连接(关闭channel),随后从ChannelGroup中移除        ctx.channel().close();        clients.remove(ctx.channel());    }}Booter启动类

@Componentpublic class NettyBooter implements ApplicationListener {    @Override    public void onApplicationEvent(ContextRefreshedEvent event) {        if (event.getApplicationContext().getParent() == null) {            try {                NettySocket.getInstance().start();            } catch (Exception e) {                e.printStackTrace();            }        }    }}

免责声明:本内容仅代表回答者见解不代表本站观点,请谨慎对待。

版权声明:作者保留权利,不代表本站立场。

回复

使用道具 举报

可能感兴趣的问答

发新帖
  • 微信访问
  • 手机APP