netty解析卡住,怎么处理?
就是用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个问题解决了....
win10因为cmd开了快速编辑,有时候会卡住,导致java项目一起卡住.按回车后项目继续运行,东西就输出出来了....
cmd执行程序时容易卡住
@ccfish 你的方向是对的,可没有解决问题.
看不出来什么问题啊,加点日志,看一下是不是哪个方法没跑完。
之前通过redis处理map的更新时,高并发会有锁住的情况。后续把map中更新频繁的值取出来直接放redis就好了。
不一定要netty来背锅