2016-11-03 12 views
0
Socket s; 
    try { 
     s = new Socket(InetAddress.getByName("stackoverflow.com"), 80); 

     PrintWriter pw = new PrintWriter(s.getOutputStream()); 
     pw.println("GET/HTTP/1.1"); 
     pw.println("Host: stackoverflow.com"); 
     pw.println(); 
     pw.flush(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     String t; 

     while((t = br.readLine()) != null) 
      System.out.println(t); 

     br.close(); 

    } catch (IOException ex) { 
     Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
    } 

私はWhileループの問題だと思いますが、すべてのデータをフェッチした後にどのように停止するのか分かりません。BufferedReader Whileループの後にJavaプログラムがフリーズする

+2

あなたはソケットを閉じ、その多くのバイトを読み、その後、応答ヘッダを読み、コンテンツの長さを見つける必要があります。接続が有効になっている可能性があり、別の要求を送信するのを待っています。代わりにHttpClientを使用してこれを行うのはなぜですか? http://hc.apache.org/httpcomponents-client-ga/ – BretC

答えて

0

私はこの質問で答えを見つけました。 https://stackoverflow.com/a/1577833/4028581

あなたの問題は、「チャンク」をエンコードしたコンテンツです。これは、応答が開始された時点でWebサーバーから要求されたコンテンツの長さが不明な場合に使用されます。基本的には、送信されるバイト数と、それに続くCRLFと、それに続くバイトで構成されます。応答の終わりは、あなたが見ている正確なシーケンスによって通知されます。 Webサーバーは、次の要求を待っています(これは「要求パイプライニング」とも呼ばれます)。

の1-使うHTTPバージョン1.0:

あなたはいくつかの可能性があります。これにより、レスポンスが完全に送信されたときにWebサーバーが自動的に接続を閉じるようになります。

2リクエストを送信するときに、 "Connection:close"ヘッダーを指定します。これにより接続も終了します。

3「チャンク」を正しくエンコードするコンテンツを解析し、これが応答が完了したかのように単純に処理します。

で:ボム

関連する問題