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.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必要があります。それ以外の場合は、データが利用可能になるまで待機します。ノンブロッキングNIOの詳細については、こちらをご覧ください。

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

ブロックする方法です。何を期待していましたか?

基になるソケットに読み取りタイムアウトを設定するか、おそらくセレクターと組み合わせて、チャネルを非ブロック モードにすることができます。

于 2012-07-25T00:52:57.823 に答える