0

Java 代码如下:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;

import java.nio.channels.SocketChannel;

public class Test {

    public static void main(String[] args) throws IOException {

        SocketChannel channel = SocketChannel.open(new InetSocketAddress(
                "google.com", 80));

        ByteBuffer buffer = ByteBuffer.allocate(1024);

        while ((channel.read(buffer)) != -1) {

            buffer.clear();
        }

        channel.close();
    }
}

这段代码很简单。

但是我没有向 Channel 写入任何数据,因此它不包含任何要读取的数据。

在这种情况下,方法channel.read()执行时间过长并且不返回任何数据。

我该如何处理这种情况?

谢谢。

4

2 回答 2

5

更新:查看您的示例,您正在连接到 Web 服务器。在你告诉它你想做什么之前,Web 服务器不会响应。例如做一个GET请求。

示例(没有正确的字符编码):

public static void main(String args[]) throws IOException {

    SocketChannel channel = SocketChannel.open(
            new InetSocketAddress("google.com", 80));

    channel.write(ByteBuffer.wrap("GET / HTTP/1.1\r\n\r\n".getBytes()));

    ByteBuffer buffer = ByteBuffer.allocate(1024);
    while ((channel.read(buffer)) != -1) {

        buffer.flip();

        byte[] bytes = new byte[buffer.limit()];
        buffer.get(bytes);
        System.out.print(new String(bytes));

        buffer.clear();
    }

    channel.close();
}

如果您不希望您read的 s 被阻止,则需要将您的频道配置为 non-blocking。否则它将坐下来等待数据可用。您可以在此处阅读有关非阻塞 NIO 的更多信息。

channel.configureBlocking(false);
于 2012-07-24T08:13:01.267 回答
3

这是一种阻塞方法。你期待什么?

您可以在底层套接字上设置读取超时,或者您可以将通道置于非阻塞模式,可能与选择器一起使用。

于 2012-07-25T00:52:57.823 回答