Java 为什么不能';使用非阻塞I/O socketchannel读取完整的传入数据

Java 为什么不能';使用非阻塞I/O socketchannel读取完整的传入数据,java,socketchannel,Java,Socketchannel,我正在尝试使用SocketChannel测试FTP,但这并不是我所期望的。我知道我需要设置一个选择器算法,选择OP_CONNECT,OP_READ键来执行连接和读取功能,一切正常,但为什么传入数据没有完全读取?另一方面,如果我调试程序,它可以被正确读取,因为我做得非常慢。我认为这是同步问题,所以我尝试只提交一个密钥(甚至尝试一步一步地硬编码该方法,但问题仍然存在) 有人遇到过这个问题吗?我如何确保完整的传入数据准备好读取而不是只读取部分数据,有时使用非阻塞IO和等待所有数据可用是互斥的(因为等待

我正在尝试使用SocketChannel测试FTP,但这并不是我所期望的。我知道我需要设置一个选择器算法,选择OP_CONNECT,OP_READ键来执行连接和读取功能,一切正常,但为什么传入数据没有完全读取?另一方面,如果我调试程序,它可以被正确读取,因为我做得非常慢。我认为这是同步问题,所以我尝试只提交一个密钥(甚至尝试一步一步地硬编码该方法,但问题仍然存在)


有人遇到过这个问题吗?我如何确保完整的传入数据准备好读取而不是只读取部分数据,有时使用非阻塞IO和等待所有数据可用是互斥的(因为等待完整输入需要阻塞!)。您需要选择一个或另一个。对于非阻塞读取,您必须进行多次连续读取,直到到达数据末尾。@MarkPeters什么是“多次连续读取”“,我确实循环读取直到-1,这可能是字节还不可用的情况,但我如何确保到达数据的结尾??循环秒甚至响应-1?@taymedee您的协议(比如FTP)必须包括一种检测文件结尾的方法。这可能是消息前面发送的长度、特殊的流结尾数据序列、控制消息等。我明白了,谢谢Mark Peter和Chris Pitman:)