簡體   English   中英

代理服務器無法將響應發送回客戶端

[英]Proxy server can not send response back to client

我的客戶端和服務器都使用NodeJS編寫時,我正在使用Java創建代理服務器。 由於客戶端可以發送多個請求,因此我正在為每個客戶端請求向代理服務器創建線程。 現在,當我從服務器獲得響應(整數值)時,我想將相同的數據從代理服務器發送回客戶端。 但是我的代理服務器無法執行此操作。

客戶期望在100毫秒內做出響應。 所以我設置了連接並讀取超時屬性。 如果我在這段時間內沒有收到響應,那么我想用整數0響應客戶端。

SocketServer.java

private int portNo;
private ServerSocket serverSocket = null;

public SocketServer(int portNo) {
    this.portNo = portNo;
    try {
        serverSocket = new ServerSocket(this.portNo);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void runServer() {
    while(true) {
        try {
            Socket clientSocket = serverSocket.accept();
            new Thread(new Task(clientSocket)).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public static void main(String args[]) {
    SocketServer socketServer = new SocketServer(3000);
    socketServer.runServer();
}

Task.java

public class Task implements Runnable {

    Socket socket = null;

    public Task(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            String dataFromClient = in.readLine(); // this is the url from client
            String partOfLink = dataFromClient.substring(5, 9);

            URL url = new URL("http://localhost:3001/" + partOfLink);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setDoOutput(true);
            conn.setConnectTimeout(80);
            conn.setReadTimeout(80);

            // Get the response
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = rd.readLine()) != null) {
                out.write(line);
            }

        } catch (IOException e) {
            //e.printStackTrace();
            try {
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                out.write(0);
            } catch (IOException e1) {
                e1.printStackTrace();
            }   
        }
    }
}

您現在遇到的特定問題可能是客戶端收到零並說:“這不是完整的HTTP答復,我希望獲得完整的HTTP答復,因此必定會有更多的數據來”,因此它等待獲取更多數據

由於客戶端僅講HTTP,並且在超時情況下您不向客戶端發送HTTP,您為什么希望它能正常工作?

即使成功,您實際上也沒有這樣做! 您已將HTTP解碼器附加到出站連接,並將解碼的輸出中繼到客戶端。 但是客戶端希望使用原始 HTTP。

有很多方法可以咬你。 假設代理響應標頭指示分塊編碼。 您或者需要修改這些標頭,或者也需要使用分塊編碼將數據發送到客戶端,因為接收代理響應的代碼會解碼分塊編碼。 代碼在哪里?

您需要正確處理HTTP連接持久性。 您需要檢測客戶端是否支持它以及代理的回復是否兼容,以了解代理回復后如何處理客戶端連接。 你應該關閉它嗎? 您是否應該嘗試在同一連接上收到其他答復? 這取決於幾個因素-正確執行此決策的代碼在哪里?

您的代碼還有很多其他問題。 您應該查看適用於現有HTTP代理的代碼,並了解其工作方式。 要使真正的HTTP代理正常工作,您必須解決很多問題,但尚未解決。

有一些可能的破解方法可能會使這種方法行之有效,以至於您可以將其作為一種方法進行傳播。 但是,如果這是必須可靠的重要應用程序,那么這是錯誤的方法。 HTTP代理是一件大而復雜的事情。 此代碼不是一個。

查看為您可以使用的實際HTTP代理查找最簡單的代碼。 閱讀HTTP規范,並仔細查看代理要求。 這是一個雷區,您確實應該從一個已知起作用的HTTP代理開始,並根據需要對其進行修改。

暫無
暫無

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

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