簡體   English   中英

Java代理-無法收到主機/套接字問題的響應

[英]Java Proxy - Can't receive response from host/Socket issue

我正在編寫一個簡單的Java代理。 給出了一般的體系結構(方法簽名等),這是Main類的外觀:

private static Socket clientSocket;
private static ServerSocket client;
private static int myPort;

public static void init(int port) throws IOException {
    client = new ServerSocket(port);
    clientSocket = client.accept();
}
public static void handle(Socket clientSocket) {
    try {
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        HttpRequest httpRequest = new HttpRequest(in);

        String hostname = httpRequest.getHost();
        //443 hardcoded from reading the http headers. 
        //Testing using isitchristmas.com
        Socket serverSocket = new Socket(hostname, 443);
        BufferedReader out = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
        HttpResponse httpResponse = new HttpResponse(out);
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
public static void main(String args[]) {
    try {
        myPort = Integer.parseInt(args[0]);
        try {
            System.out.println("Initializing socket...");
            init(myPort);
        } catch (IOException e) {
            System.out.println("[ERROR]: " + e.getMessage());
        }
        handle(clientSocket);
    } catch (Exception e) {
        System.out.println("[ERROR]: " + e.getMessage());
    }
}

但是,在讀取HttpResponse類時,控制台將掛起並且永遠不會完成請求:

    public HttpResponse(BufferedReader fromServer) throws IOException {
    String line;
    String statusLine = "";
    // Never goes past here
    while ((line = fromServer.readLine()) != null) {
        if (line.isEmpty()) {
            break;
        }

        if (line.toLowerCase().contains("status")) {
            statusLine = line;
        }

        response.append(line);
    }

    if (!response.toString().isEmpty()) {
        getDataAndHeadersFromResponse(response.toString());
        System.out.println("\n\nHTTP Response:\n");
        System.out.println("Status Line: " + statusLine);
        System.out.println("Header Lines: " + headerLines + "\n\n");
        System.out.println("Data: " + data);
    }

}

我懷疑這與我創建套接字的方式有關...在ServerSocket上不調用close()會釋放出一個已在使用的地址:JVM_Bind異常。 我似乎也沒有正確獲得serverSocket參數。 正如您現在所知道的,我對套接字編程不是很精通。 怎么了

  • 您需要偵聽端口80:關於HTTPS的分配中沒有任何內容。
  • 請求主體不會在流的末尾終止,因為客戶端仍然打開套接字以讀取響應。
  • 您需要從客戶端讀取Content-length標頭,然后精確讀取請求主體的這么多字節。
  • 因此,您不能使用BufferedReader解決此問題,因為您必須計算字節而不是字符。
  • 將請求發送到服務器后,您真正需要做的就是將響應字節直接從服務器復制到客戶端: 而不是分配中的內容。
  • 為了遵守作業中所說的內容,類似地,您必須從服務器讀取Content-Length標頭,並從服務器讀取所有其他標頭,空行以及確切的內容長度字節,然后將它們全部復制給客戶。 與僅復制字節相比,您可以看到這是浪費時間。
  • HTTP中的行終止符是\\r\\n ,而不是\\n

作業不足:

  • 指定不可行的BufferedReader
  • 然后不一致地指定要從服務器讀取的DataInputStream
  • 完全沒有理由使用DataInputStreamInputStream就足夠了
  • 不涉及RFC 2616或其前身或后繼
  • 沒有指定HTTP 1.0或1.1
  • 不會多說“緩存網頁”,只有在第2頁提到過,此后再也沒有。

學生應該抱怨。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM