netty解析卡住,怎么处理?

发布于 2022-09-07 04:13:53 字数 3413 浏览 34 评论 0

就是用java,netty写的一个游戏服务器,目前经常被爬虫请求.

目前一夜过后,netty就卡住了,新的请求就会一直卡住,即不在控制台打印出来,也不响应客户端请求.

有时候我在服务器的cmd上按个回车,就会又响应客户端请求.但这种方法显然不能用...

我关闭用ChannelHandlerContext chc.close();是不是这样不能断开连接,导致线程被占满?

 //分配用于处理业务的线程组数量  

  protected static final int BisGroupSize = 6;

  //每个线程组中线程的数量  

  protected static final int worGroupSize = 10;

红框处是我按回车后输出的,不按回车前客户端请求卡住.

红框处是我按回车后输出的,不按回车前客户端请求卡住.

    //SocketControl
    public static void  run(int port) throws Exception {  
        ServerBootstrap bootstrap = new ServerBootstrap();  
        bootstrap.group(bossGroup, workerGroup);
        bootstrap.channel(NioServerSocketChannel.class);  
        bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
            @Override  
            protected void initChannel(SocketChannel ch) throws Exception {
                ChannelPipeline pipeline = ch.pipeline();  
                
                // 以("\n")为结尾分割的 解码器  
                pipeline.addLast("framer", new DelimiterBasedFrameDecoder(10240, Delimiters.lineDelimiter()));  
                pipeline.addLast("decoder", new MyStringDecoder(Charset.forName("UTF-8")));  
                pipeline.addLast("encoder", new StringEncoder(Charset.forName("UTF-8")));  
                pipeline.addLast(new SocketServerHandler());  
            }  
        });  
        bootstrap.bind(IP,port).sync();  
        log.info("Socket服务器已启动完成,于 "+port+" 端口");  
    }  
public class MyStringDecoder extends MessageToMessageDecoder<ByteBuf> {
 
    private final Charset charset;
    
    /**
     * Creates a new instance with the current system character set.
     */
    public MyStringDecoder() {
        this(Charset.defaultCharset());
    }

    /**
     * Creates a new instance with the specified character set.
     */
    public MyStringDecoder(Charset charset) {
        if (charset == null) {
            throw new NullPointerException("charset");
        }
        this.charset = charset;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
        if(msg.getByte(0)!='{' || msg.getByte(msg.capacity()-1)!='}'){
            
        }else{
            out.add(msg.toString(charset));
        }
    }
}
public class SocketServerHandler extends SimpleChannelInboundHandler<String> {  
    private static final Logger log = Logger.getLogger("ruanxin");  
  
    @Override  
    public void exceptionCaught(ChannelHandlerContext chc, Throwable cause) throws Exception {  
        log.info(cause.getMessage());
        chc.close();
    }  
  
    @SuppressWarnings("unchecked")
    @Override  
    public void channelRead(ChannelHandlerContext chc, Object data) throws Exception {    
        if(data==null || !(data instanceof String)){
            log.info("不是字符串或数据为空");
            chc.close();
            return;
        }
        String dataStr=(String) data;
        log.info("|||" + dataStr+"|||");
        if(!dataStr.startsWith("{") || !dataStr.endsWith("}")){
            log.info("失败数据内容:data=" + dataStr);
            chc.close();
            return;
        }
        log.info("Read数据内容:data=" + data);
        //...
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

满地尘埃落定 2022-09-14 04:13:53

这个问题解决了....

win10因为cmd开了快速编辑,有时候会卡住,导致java项目一起卡住.按回车后项目继续运行,东西就输出出来了....

cmd执行程序时容易卡住

@ccfish 你的方向是对的,可没有解决问题.

你是我的挚爱i 2022-09-14 04:13:53

看不出来什么问题啊,加点日志,看一下是不是哪个方法没跑完。
之前通过redis处理map的更新时,高并发会有锁住的情况。后续把map中更新频繁的值取出来直接放redis就好了。

不一定要netty来背锅

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文