Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Socketchannel始终为空_Java_Sockets - Fatal编程技术网

Java Socketchannel始终为空

Java Socketchannel始终为空,java,sockets,Java,Sockets,我正在尝试向SMTP服务器发送EHLO命令。连接成功,但我似乎无法从中读取任何数据: ByteBuffer byteBuffer = null; try { socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("host", 25)); socketChannel.configureBlocking(true);

我正在尝试向SMTP服务器发送EHLO命令。连接成功,但我似乎无法从中读取任何数据:

 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()
可能在一段时间后返回0
read()
的返回值应该总是顺便检查一下,否则您不知道收到了多少字节,这可能小于缓冲区的大小。谢谢。不过,该文档也可以更清楚地说明这一点。缓冲区操作的语义一开始有点违反直觉,但一旦使用过一两次,就完全有意义了。flip()必须位于write()或get()之前,而不是之后,标题中的“SocketChannel always null”与将ByteBuffer打印为空字符的结果之间存在很大差异。请修改你的标题以同意你的问题。
    socketChannel.write(byteBuffer.put(SMTP_EHLO.getBytes()));