2
回答
有个nio socket 问题想请教一下阁下
终于搞明白,存储TCO原来是这样算的>>>   

@鉴客 你好,想跟你请教个问题:

之前看到您发表过一篇博文介绍了nio socket 用法,想必您对这块还是很有研究的, 我现在遇到一个问题 : 客户端在读数据的时候 

SocketChannel sc = (SocketChannel) sk.channel();

ByteBuffer buffer = ByteBuffer.allocate(1024);

sc.read(buffer);

buffer.flip();
如果是数据量稍微有点大 比如4000多字节的时候 , 这时候接收的数据就分段了, 我想这个与缓冲区有关系,但是我缓冲区设置的足够大了 -----ByteBuffer.allocate(10240), 这种情况应该如何处理呢?

NIO
举报
v_cool
发帖于5年前 2回/223阅
共有2个答案 最后回答: 5年前

缓冲区不要开那么大 都是吃内存的  直接循环读 跟BIO没有什么区别的  

底层TCP都是对数据进行优化的,每次都是穿MTU大小的数据,所以4M肯定分拆分了 要循环读

一般NIO的读操作是这样的:


private ByteBuffer buffer = ByteBuffer.allocate( 1024 );?
SocketChannel sc = (SocketChannel)key.channel();?
while (true) {
	buffer.clear();
	int r = sc.read( buffer );
	if (r<=0) {
		break;
	}
	buffer.flip();
	sc.write( buffer );
}
你上面的代码的问题在于,无论你分配多么大的buffer,链路层帧长度最大为1500字节,分片是必然的;从事件驱动的角度来说,系统通知你有几次读事件,也是不确定的。
顶部