Java Http Proxy无法正常工作

时间:2016-05-20 07:28:32

标签: java sockets proxy

我尝试为Http实现Java代理(Http将是Http工作后的扩展)。我在互联网上找到了很多资源,并试图自己解决所有问题。但是现在我来到了我坚持的地步。 我的Proxoy不会加载完整的http网站。套接字已经关闭,我收到很多错误消息。所以我想我尝试通过一个已关闭的Socket发送一些东西。

我的问题是现在。我不明白为什么会这样。我想了很多问题,但我找不到错误。从我这边只有当服务器关闭与我的代理服务器的连接时,套接字才会关闭。当我从服务器读取输入流上的-1时会发生这种情况。

我会很高兴得到任何帮助:-)

问候 克里斯托夫

public class ProxyThread extends Thread {
Socket client_socket;
Socket server_socket;
boolean thread_var = true;
int buffersize = 32768;

ProxyThread(Socket s) {
    client_socket = s;
}

public void run() {
    System.out.println("Run Client Thread");
    try {
        // Read request
        final byte[] request = new byte[4096];
        byte[] response = new byte[4096];

        final InputStream in_client = client_socket.getInputStream();
        OutputStream out_client = client_socket.getOutputStream();

        in_client.read(request);
        System.out.println("---------------------- Request Info --------------------");
        System.out.println(new String(request));        

        Connection conn = new Connection(new String(request));
        System.out.println("---------------------- Connection Info --------------------");
        System.out.println("Host: " + conn.host);
        System.out.println("Port: " + conn.port);
        System.out.println("URL: " + conn.URL);
        System.out.println("Type: " + conn.type);
        System.out.println("Keep-Alive:" + conn.keep_alive);
        server_socket = new Socket(conn.URL, conn.port);
        InputStream in_server = server_socket.getInputStream();
        final OutputStream out_server = server_socket.getOutputStream();
        out_server.write(request);
        out_server.flush();

        Thread t = new Thread() {
            public void run() {
              int bytes_read;
              try {
                while ((bytes_read = in_client.read(request)) != -1) {
                      out_server.write(request, 0, bytes_read);
                      out_server.flush();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
          };
          t.start();

        int bytes_read;
        while ((bytes_read = in_server.read(response)) != -1) {
            out_client.write(response, 0, bytes_read);
            out_client.flush();
            //System.out.println("---------------------- Respone Info --------------------");
            //System.out.println(new String(response));
        }

        //System.out.println("EIGENTLICH FERTIG");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            client_socket.close();
            server_socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
}

编辑: 我的HTTP代理现在有效。一旦你理解了ryl是什么,答案就非常有用了。如果您听到寻找解决方案,这些问题可能会对您有所帮助:

  • 客户端是否仅向一个网站/网络服务器发送请求?我们总是拥有相同的端口/主机名吗?

  • 答案中的循环非常有用,但想想放在哪里?

最后想一想:谢谢@EJP,你的回复非常有用。理解它只需要一点时间!

1 个答案:

答案 0 :(得分:0)

你犯了所有常见的错误,还有一些错误。

  1. 不保证整个请求只能在一次读取中到达。您不能假设已经到达多个字节。你必须循环。

  2. 此阶段您没有检查流的结束。

  3. 您需要熟悉RFC 2616才能实现HTTP,特别是有关内容长度和传输编码的部分。

  4. 您不能假设服务器在发送回复后会关闭连接。

  5. 关闭输入或输出流或套接字会关闭套接字。这就是您SocketException: socket closed

  6. 的原因
  7. 当你进入HTTPS时,你需要查看CONNECT动词。

  8. 刷新套接字输出流什么都不做,并且要避免在循环内刷新,