基于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();
}
}
实在抱歉,刚来社区,不知道提问规则,排版也不好,请多多包涵
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。