1

HttpURLConnection または HttpClient を使用する代わりに、ソケットから直接データを取得するプログラムを作成しようとしています。ソケットを使用すると、要件に合わせてデータを操作する自由度が高まります。ソケットを使用して、各チャンクで送信されたチャンク ヘッダーを保存できることを願っています。以下は、それを達成するための私のコードです。残念ながら、コードはエラーなしで実行されますが、停止するまでに少なくとも 40 秒間実行されます。また、プログラムがサーバーに接続されていることを確認したにもかかわらず、サーバーから InputStream を取得できません。

    Socket socket = new Socket(hostAddr, port);
    InputStream in = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(in);
    char[] streamBuff = new char[8192];
    StringBuilder receivedData = new StringBuilder();
    int count = 0;
    while((count = isr.read(streamBuff)) > 0)
    {
        receivedData.append(streamBuff, 0, count);
    }
    System.out.println(receivedData);
4

2 に答える 2

1

HTTP/1.1には永続的な接続があります。そのループ内のすべての応答チャンクを読み取ってから、サーバーがタイムアウトして TCP 接続を閉じるまでブロックします。

編集 0:

ところで、サーバーに *リクエスト* を送信していないため、何も返されません。自分で実装したい場合は、プロトコルを調べてください。
于 2012-06-26T18:24:38.680 に答える
0

まず、GET または POST のいずれかでリクエストを行う必要があります。openStream()を使用してから読み取る方法を示す例を次に示しますInputStream

public class DateWala {

    public static void main(String[] args){

        try {
            URL url = new URL("http://www.google.com");
            InputStream is = url.openStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            String s = null;

            while ((s=br.readLine())!=null){
                System.out.println(s);
            }

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
于 2012-06-26T18:45:16.977 に答える