开发者社区> 问答> 正文

netty客户端读取文件内容内存溢出:报错

基于netty 4.0.14final

最近做一个存储转发项目,使用netty框架,客户端发送报文到服务器端,服务器端将报文入库,在客户端模拟报文时,采用读取txt文件的方式,每读取一行就发送到服务器端,小文件没什么问题,但读取200M左右的文件时,机器内存就无限飙升,直到死机,我的机器内存是4G的,按理说不会出现这种问题的啊,求大婶们解答新手疑惑。。公司开发机器不联网,不过我这个代码基本上和Netty权威指南上一样的:

//客户端

public class EchoClient {


    public void connect(int port, String host) throws Exception {
// 配置客户端NIO线程组
EventLoopGroup group = new NioEventLoopGroup();
try {
   Bootstrap b = new Bootstrap();
   b.group(group).channel(NioSocketChannel.class)
   .option(ChannelOption.TCP_NODELAY, true)
   .handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch)
throws Exception {
   ByteBuf delimiter = Unpooled.copiedBuffer("$_"
   .getBytes());
   ch.pipeline().addLast(
   new DelimiterBasedFrameDecoder(1024,
   delimiter));
   ch.pipeline().addLast(new StringDecoder());
   ch.pipeline().addLast(new EchoClientHandler());
}
   });


   // 发起异步连接操作
   ChannelFuture f = b.connect(host, port).sync();


   // 当代客户端链路关闭
   f.channel().closeFuture().sync();
} finally {
   // 优雅退出,释放NIO线程组
   group.shutdownGracefully();
}
    }


    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
int port = 8080;
if (args != null && args.length > 0) {
   try {
port = Integer.valueOf(args[0]);
   } catch (NumberFormatException e) {
// 采用默认值
   }
}
new EchoClient().connect(port, "127.0.0.1");
    }
}

//客户端业务处理Handler

public class EchoClientHandler extends ChannelHandlerAdapter {


   
     * Creates a client-side handler.
     */
    public EchoClientHandler() {
    }


    @Override
    public void channelActive(ChannelHandlerContext ctx) {
    String fileName="D:\\test.txt";

try{

File f=new File(fileName);

InputStreamReader in =new InputStreamReader(new FileInputStream(f),"utf8");

BufferedReader br=new BufferedReader(in);

String lintxt=null;

while((lintxt=br.readline())!=null){

byte[] req=(lintxt+"$_").getBytes();

ByteBuf mes=Unpooled.buffer(reqq.length);

mes.writeBytes(req);

ctx.writeAndFlush(mes);

}

br.close

}catch(Exception e){

e.printStackTrace();

}
    }


    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
   throws Exception {

    }


    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush();
    }


    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
    }
}

实在抱歉,刚来社区,不知道提问规则,排版也不好,请多多包涵


展开
收起
kun坤 2020-06-07 00:42:23 728 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载