Java Socketchannel始终为空
我正在尝试向SMTP服务器发送EHLO命令。连接成功,但我似乎无法从中读取任何数据:Java Socketchannel始终为空,java,sockets,Java,Sockets,我正在尝试向SMTP服务器发送EHLO命令。连接成功,但我似乎无法从中读取任何数据: ByteBuffer byteBuffer = null; try { socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("host", 25)); socketChannel.configureBlocking(true);
ByteBuffer byteBuffer = null;
try {
socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("host", 25));
socketChannel.configureBlocking(true);
byteBuffer = ByteBuffer.allocateDirect(4 * 1024);
} catch (Exception e) {
e.printStackTrace();
}
try {
byteBuffer.clear();
socketChannel.write(byteBuffer.put(SMTP_EHLO.getBytes()));
byteBuffer.flip();
socketChannel.read(byteBuffer);
byteBuffer.get(subStringBytes);
String ss = new String(subStringBytes);
System.out.println(byteBuffer);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
print语句的输出总是\u000(null)
您可以将SMTP\u EHLO放入缓冲区,但必须翻转()
缓冲区才能写入。否则,将不向套接字通道写入任何内容。从SocketChannel
Javadoc:
尝试将最多r个字节写入通道,其中r为
缓冲区中剩余的字节数,即,src.remaining()
,
此时调用此方法
并从缓冲区#剩余()
:
public final int remaining()
返回当前位置和限制之间的元素数
因此,在byteBuffer.put(…)
current position==limit.之后,线路上不会有流量,也不会从中读取流量,这导致read()
可能在一段时间后返回0read()
的返回值应该总是顺便检查一下,否则您不知道收到了多少字节,这可能小于缓冲区的大小。谢谢。不过,该文档也可以更清楚地说明这一点。缓冲区操作的语义一开始有点违反直觉,但一旦使用过一两次,就完全有意义了。flip()必须位于write()或get()之前,而不是之后,标题中的“SocketChannel always null”与将ByteBuffer打印为空字符的结果之间存在很大差异。请修改你的标题以同意你的问题。
socketChannel.write(byteBuffer.put(SMTP_EHLO.getBytes()));