SpringBoot整合netty实现多客户端连接出现的一个问题

2024-01-22 09:57:53 浏览数 (1)

bug场景

现在有两个客户端,任何一个客户端单独连接netty服务器时,都可以正常发送消息。但是出现了以下问题:一个客户端连接netty服务器时,可以正常发送消息,第二个客户端可以连接netty服务器,但是不能正常发送消息。

bug代码

代码语言:java复制
@Component
public class SocketInitializer extends ChannelInitializer<SocketChannel> {
    @Resource
    private NettyServiceHandler nettyServiceHandler;

    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        ChannelPipeline pipeline = socketChannel.pipeline();

        pipeline.addLast(new LineBasedFrameDecoder(2048));
        pipeline.addLast(new StringDecoder());
        pipeline.addLast(new StringEncoder());

        // 添加上自己的处理器
        pipeline.addLast(nettyServiceHandler);
    }
}

bug原因

server.netty.NettyServiceHandler is not a @Sharable handler, so can't be added or removed multiple times.

意思是不能nettyServiceHandler不是一个@Sharable handler,所以不能被多个socketChannel添加。所以只有第一个客户端可以正常发送消息,之后的客户端无法正常发送消息。

解决方法

将NettyServiceHandler的Bean使用@ChannelHandler.Sharable标注

代码语言:java复制
@Component
@ChannelHandler.Sharable
public class NettyServiceHandler extends SimpleChannelInboundHandler<String> {
                ......
                ......
}

或者将

代码语言:java复制
pipeline.addLast(nettyServiceHandler);

修改为

代码语言:java复制
pipeline.addLast(new NettyServiceHandler());

0 人点赞