gpt4 book ai didi

Java 代理 - 无法接收来自主机/套接字问题的响应

转载 作者:行者123 更新时间:2023-12-01 10:21:54 25 4
gpt4 key购买 nike

我正在编写一个简单的 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异常(exception)。我似乎也没有正确获取 serverSocket 参数。正如您现在所知,我不太熟悉套接字编程。这里有什么问题吗?

最佳答案

  • 您需要监听端口 80:作业中没有任何有关 HTTPS 的内容。
  • 请求正文不会因流结束而终止,因为客户端仍然打开套接字来读取响应。
  • 您需要从客户端读取 Content-length header ,然后准确读取请求正文的字节数。
  • 因此,您无法使用 BufferedReader 解决此问题,因为您必须计算字节数,而不是字符数。
  • 将请求发送到服务器后,您真正需要做的就是将响应字节直接从服务器复制到客户端:而不是作业中所说的内容。
  • 为了坚持分配的内容,您同样必须从服务器读取 Content-Length header 、所有其他 header 、空行以及来自服务器的响应的内容长度字节,并且将它们全部复制到客户端。您可以看到,与仅复制字节相比,这是浪费时间。
  • HTTP 中的行终止符是 \r\n,而不是 \n

作业存在以下缺陷:

  • 指定不可行的 BufferedReader
  • 然后不一致地指定用于从服务器读取的 DataInputStream
  • 根本没有理由使用DataInputStream:InputStream就足够了
  • 不涉及 RFC 2616 或其前身或后继者
  • 未指定 HTTP 1.0 还是 1.1
  • 不再详细介绍“缓存网页”,该内容仅在第 2 页上提及,此后从未提及。

学生应该提示。

关于Java 代理 - 无法接收来自主机/套接字问题的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35543175/

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