Java中的简单代理:POST请求异常

时间:2014-06-24 07:23:22

标签: java proxy

我在java中编写了一个简单的HTTP代理。代码如下:

public class SampleProxy {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        boolean listening = true;
        int port = 1234;
        try {
            serverSocket = new ServerSocket(port);
        } catch (IOException e) {
            System.out.println("Port Error");
            System.exit(-1);
        }
        while (listening) {
            new ProxyThread(serverSocket.accept()).start();
        }
        serverSocket.close();
    }
}

class ProxyThread extends Thread {

    private final Socket clientSocket;

    public ProxyThread(Socket socket) {
        this.clientSocket = socket;
    }

    public void run() {
        try {
            String parts[];
            // Read request
            InputStream incomingIS = clientSocket.getInputStream();
            int incomingLen = incomingIS.available();

            byte[] b = new byte[8196];

            int len = incomingIS.read(b);

            if (len > 0) {

                System.out.println("The Request is : \n" + new String(b, 0, len) + "\n*********\n");

                Socket socket = new Socket("localhost", 80);

                OutputStream outgoingOS = socket.getOutputStream();

                outgoingOS.write(b, 0, len);

                OutputStream incomingOS = clientSocket.getOutputStream();
                InputStream outgoingIS = socket.getInputStream();


                int length;
                //Read from server
                byte[] b2=new byte[8196];
                length = outgoingIS.available();

                outgoingIS.read(b2);

                incomingOS.write(b2, 0, b2.length);

                incomingOS.close();
                outgoingIS.close();
                outgoingOS.close();
                incomingIS.close();

                socket.close();
            } else {
                incomingIS.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception ex) {
            Logger.getLogger(ProxyThread.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

如图所示,客户端在端口1234处请求,代理将请求转发给服务器并获取响应,然后将响应返回给客户端。

在正常情况下,这很好用,但是,我尝试使用shell脚本测试相同的高流量情况,该脚本发送多个(大约50个)POST请求,一个接一个,并发现对于某些请求,只收到标题。 POST数据被省略,但Content-Length显示了应该发送的变量的适当长度。对于特定请求,这不会发生,但随机发生,可能是50个请求中的3个或4个。

然而,GET请求似乎不存在相同的错误。

有关实际导致错误的任何建议吗?

1 个答案:

答案 0 :(得分:0)

这里常见的错误。滥用available(),无法正确实现HTTP协议。您需要彻底阅读RFC 2616,尤其是有关请求和响应长度的部分;并重新读取InputStream.available()的Javadoc,在这里你会发现一个特殊的警告,不要像你在这里一样使用它。