这段java的nio读取返回数据是否正确呢?

超级呆子 发布于 2013/03/07 12:35
阅读 337
收藏 0

假设我要从某个远端机器上读取一个数据,发送的数据省略了,主要是 读取服务端返回的数据,服务端的socket一直不会关闭

服务端返回的数据大小未知,可能是几十个字节,或者几十M,假设我的缓冲区大小定义为1K把。然后服务端返回的数据大小为5K,这样最终服务端发包可能会分解成若干个数据包, 

如果这些发送的包之间有延迟的话,比如先发了2K,中间因为延迟,后面的3K数据在1毫秒之后才到达。

那么下面这个代码的while判断逻辑是否可行呢?

首先服务端socket不会关闭,那么肯定不会读到-1,但是不确定是否会读到0的情况,如果像上面说的那样服务端发送有延迟是否会出现读到0?然后循环就退出了呢?

SocketChannel socket = SocketChannel.open();
	socket.connect(new InetSocketAddress("ip", 1234));
	socket.configureBlocking(false);
	int len = -1;
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	while( (len=socket.read(buffer)) > 0 ) {
            baos.write(buffer.array());
            buffer.flip();
        }
加载中
0
huan
huan
你没有理解基础的网络 以及nio 原理。包延迟等错误都会在ip层处理,上层根本不用关心这些。
0
超级呆子
超级呆子
没有明白,能否详细说下?
0
超级呆子
超级呆子
自己顶一下
0
超级呆子
超级呆子

就说这个写法,我尝试本机开一个memcache,然后读取一个20多K的文件,

先用阻塞IO方式测试,最后读取到的是 23578 字节

但是用上面那段代码,读取到的却是:24576 字节

多了一些内容,这又是为何?

返回顶部
顶部