gpt4 book ai didi

java - 代理服务器无法将响应发送回客户端

转载 作者:行者123 更新时间:2023-12-02 01:44:37 26 4
gpt4 key购买 nike

我正在使用 Java 创建代理服务器,而我的客户端和服务器都是用 NodeJS 编写的。由于客户端可以发送多个请求,因此我为每个客户端请求到代理服务器创建线程。现在,当我从服务器返回响应(整数值)时,我想从代理服务器将相同的数据发送回客户端。但我的代理服务器无法这样做。

客户端期望在 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。

这可以通过很多方式来伤害你。假设代理响应 header 指示分块编码。您要么需要修改这些 header ,要么也使用分块编码将数据发送到客户端,因为接收代理响应的代码会解码分块编码。代码在哪里?

您需要正确处理HTTP连接持久性。您需要检测客户端是否支持它以及代理回复是否与其兼容,以便知道在代理回复后如何处理客户端连接。你应该关闭它吗?您是否应该尝试在同一连接上接收另一个回复?这取决于几个因素——正确做出这个决定的代码在哪里?

您的代码还存在很多其他问题。您应该查看可用的现有 HTTP 代理的代码并了解它们的工作原理。要使真正的 HTTP 代理正常工作,您必须解决大量问题,但您尚未解决这些问题。

有一些可能的黑客可能会使这种方法看起来足够有效,以至于您可以将其视为已完成。但如果这是一个必须可靠的重要应用程序,那么这是错误的方法。 HTTP 代理是一个庞大而复杂的东西。此代码不是一个。

看看如何找到您可以使用的实际 HTTP 代理的最简单代码。阅读 HTTP 规范并仔细查看代理的要求。这是一个雷区,您确实应该从已知可以工作的 HTTP 代理开始,并根据需要对其进行修改。

关于java - 代理服务器无法将响应发送回客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53869400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com