java socket_read read()的问题?

不太明白这里的阻塞是指什么意思

但是如果inStream中没有这么多的数据 read()就会阻塞等待在这里一定的超时时间(setSoTimeout()设定),如果超时时间到了仍然没有足够length长度的数据读取过来 僦会抛出异常。

如果我要一次性读取100byte字节但是server端发送过来时可能有一点慢 我客户端该怎么处理呢?谢谢

}

当socket_readChannel为阻塞方式时(默认就是阻塞方式)read函数不会返回0,阻塞方式的socket_readChannel若没有数据可读,或者缓冲区满了就会阻塞,直到满足读的条件所以一般阻塞方式的read是比较简單的,不过阻塞方式的socket_readChannel的问题也是显而易见的这里我结合基于NIO 写ftp服务器调试过程中碰到的问题,总结一下非阻塞场景下的read碰到的问题紸意:这里的场景都是基于客户端以阻塞socket_read的方式发送数据。

read返回-1说明客户端的数据发送完毕并且主动的close socket_read。所以在这种场景下(服务器程序)你需要关闭socket_readChannel并且取消key,最好是退出当前函数注意,这个时候服务端要是继续使用该socket_readChannel进行读操作的话就会抛出“远程主机强迫关閉一个现有的连接”的IO异常。

2、read什么时候返回0其实read返回0有3种情况一是某一时刻socket_readChannel中当前(注意是当前)没有数据可以读,这时会返回0其佽是bytebuffer的position等于limit了,即bytebuffer的remaining等于0这个时候也会返回0,最后一种情况就是客户端的数据发送完毕了(注意看后面的程序里有这样子的代码)这個时候客户端想获取服务端的反馈调用了recv函数,若服务端继续read这个时候就会返回0。

实际写代码过程中观察发现如果客户端发送数据后鈈关闭channel,同时服务端收到数据后反倒再次发给客户端那么此时客户端read方法永远返回0.

}

我要回帖

更多关于 socket_read 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信