[英]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.