2017-03-22 5 views
0

私の問題は、HTTPソケットを使用して特定のURLからテキストを読み取ることができないことです。たとえば、私は88.88.8.8/text.txtから読み込まれ、まだそれがエラーなしで読んだ部分にはまり、コマンドライン上の内容を印刷したい:URLからインデックスファイルを読み込み、JavaでHTTPソケットプログラミングを使用する

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.Base64; 

public class Program { 

    static final int PORT_NO = 80; 

    static Socket m_socket; 

    static String m_server; 
    static String m_index; 
    static String m_authString; 

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

     try {   
      setConnectionInfoFromArgs(args);   
      m_socket = new Socket(m_server, PORT_NO); 

      loginToServer(); 

      PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(m_socket.getOutputStream()))); 
      out.print("GET /" + m_index + " HTTP/1.1"); 
      out.print("\r\n"); 
      out.flush(); 

      BufferedReader input = new BufferedReader(new InputStreamReader(m_socket.getInputStream())); 
      String line; 

      while((line = input.readLine()) != null) { 
       System.out.println(line); //Gets stuck here 
      } 
     } catch (Exception e) { 
      System.out.println("Unable to connect!"); 
      System.out.println("Be sure to enter correct URL and authentication."); 
     } 
     finally { 
      System.exit(0); 
     } 
    } 

    public static void setConnectionInfoFromArgs(String[] args) { 
     String[] url = args[0].split("/"); 
     m_server = url[0]; 
     m_index = url[1]; 

     //Encode "userName:password" to Base64 
     byte[] encodedBytes = Base64.getEncoder().encode(args[1].getBytes()); 
     m_authString = new String(encodedBytes); 
    } 

    private static void loginToServer() throws IOException {  
      DataOutputStream auth = new DataOutputStream(m_socket.getOutputStream()); 
      auth.writeBytes("Authorization: Basic " + m_authString); 
    } 
} 
+0

BASE64 ECRYTPTIONでインターネットにパスワードを送信しないでください! __NOT__安全です! – Jerfov2

+1

@ Jerfov2 Base64は暗号化されていません。エンコーディングです。あなたのアドバイスは有効ですが、大文字で書くことは一般的に「悲鳴を滅ぼす」と表現されています。これは失礼です。 – Fildor

+0

@Fildorちょっと言いたいことがあります;) – Jerfov2

答えて

0

[OK]を私はいくつかの研究を行なったし、両方の私が判明Remy Lebeau氏によると、ホストヘッダーは不足しており、承認部分もヘッダーに正しく含まれていませんでした。以下のコードで問題を解決しました:

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(m_socket.getOutputStream())), false); 
      out.print("GET /" + m_index + " HTTP/1.1\r\n" 
        + "Host: " + m_server + "\r\n" 
        + "Authorization: Basic " + m_authString + "\r\n" 
        + "Connection: close\r\n\r\n"); 
      out.flush(); 
関連する問題