gpt4 book ai didi

java - 带套接字的简单 Java HTTP 代理卡住,没有错误消息

转载 作者:可可西里 更新时间:2023-11-01 16:47:09 28 4
gpt4 key购买 nike

我正在尝试让一个简单的多线程代理在 Java 中工作。但是,在第一个 GET 请求和网页响应之后,我无法让网页显示在我的浏览器中,程序只是卡住了(正如您从我的代码中看到的那样,我正在打印我得到的所有内容用于调试的标准输出,在那里我看到了网页的源代码,但是在打印出“客户端写入后”之后,没有任何反应(无一异常(exception),什么都没有...))。

import java.net.*;
import java.util.*;

import java.io.*;

public class Proxy
{

public static void main(String[] args)
{
try
{
ServerSocket listensocket = new ServerSocket(Integer.valueOf(args[0]));
while(true)
{
System.out.println("wait");
Socket acceptsocket = listensocket.accept(); // blocking call until it receives a connection
myThread thr = new myThread(acceptsocket);
thr.start();
}

}
catch(IOException e)
{
System.err.println(">>>>" + e.getMessage() );
e.printStackTrace();
}

}

static class myThread extends Thread
{
Socket acceptsocket;
int host, port;

String url;

myThread(Socket acceptsocket)
{
this.acceptsocket=acceptsocket;
}
public void run() {
try
{
System.out.println("hello");

Socket client = acceptsocket;
//client.setSoTimeout(100);
InputStream clientIn = client.getInputStream();
//BufferedInputStream clientIn=new BufferedInputStream(clientis);
OutputStream clientOut = client.getOutputStream();
System.out.println("hello");

String clientRequest = readStuffFromClient(clientIn); // parses the host and what else you need
System.out.print("Client request: -----\n"+clientRequest);

Socket server;
server = new Socket("xxxxxxxxxxxxx" , 80);


InputStream serverIn = server.getInputStream();
//BufferedInputStream serverIn=new BufferedInputStream(serveris);
OutputStream serverOut = server.getOutputStream();


serverOut.write(clientRequest.getBytes());
serverOut.flush();

String serverResponse = readStuffFromClient(serverIn);

System.out.print("Server Response: -----\n"+serverResponse);

clientOut.write(serverResponse.getBytes());
clientOut.flush();
System.out.println("After Client Write");

clientIn.close();
clientOut.close();
serverIn.close();
serverOut.close();
server.close();
client.close();


}
catch(Exception e)
{
System.out.println(e);
}
}
private String readStuffFromClient(InputStream clientdata)
{
ByteArrayOutputStream response = new ByteArrayOutputStream();
StringBuffer request=new StringBuffer(8192);
int i, httpstart,n=-1 ;
byte[] buffer = new byte[8192];

System.out.println("beforetry");

try
{

while((n = clientdata.read(buffer))!=-1)
{
System.out.println("before");
response.write(buffer,0,n);
//response.flush();
}
request=new StringBuffer(response.toString());
/*System.out.println("new:"+n+" "+ request.toString());
System.out.println("End client data");*/

}
catch (Exception e)
{
System.out.println("here");
System.out.println(e);
e.printStackTrace();
i = -1;
}




System.out.println("End manipulation method");
return request.toString();
}
}



}

(这是我程序的一个精简的不工作示例,从评论中可以看出我已经尝试使用 BufferedInputStream)。通常,即使对于来自浏览器的第一个 GET 请求,该程序也非常无响应。当我只读取一次客户端数据时(不是在循环中),我会更进一步,例如得到更多的 GET/Response 对,但在某些时候程序仍然卡住。

不知何故,我认为要么我遇到了一个我只是没能看到的真正微不足道的错误,要么该程序应该可以运行,但只是没有任何真正原因。

感谢任何帮助,提前致谢!

最佳答案

您需要两个线程:一个从客户端读取并写入服务器,另一个为每个已接受的套接字执行相反的操作。还有一个更微妙的地方:当您从一个方向读取 EOS 时,关闭相反的输出套接字,然后如果该线程的输入套接字已经关闭输出,则关闭两个套接字。在这两种情况下,都退出读取 EOS 的线程。

关于java - 带套接字的简单 Java HTTP 代理卡住,没有错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4290663/

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