Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用套接字编写代理_Java_Sockets_Proxy - Fatal编程技术网

Java 使用套接字编写代理

Java 使用套接字编写代理,java,sockets,proxy,Java,Sockets,Proxy,我正在使用套接字编写HTTP代理服务器,现在程序正在成功地接收请求,但我无法将其返回到浏览器 import java.io.*; import java.net.*; import java.util.List; import java.util.Map; import java.util.concurrent.*; public class Server { public void startServer() { final ExecutorService clientProc

我正在使用套接字编写HTTP代理服务器,现在程序正在成功地接收请求,但我无法将其返回到浏览器

import java.io.*;
import java.net.*;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;


public class Server {


public void startServer() {
    final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);

    Runnable serverTask = new Runnable() {
        @Override
        public void run() {
            try {
                @SuppressWarnings("resource")
                ServerSocket serverSocket = new ServerSocket(80);
                while (true) {
                    Socket clientSocket = serverSocket.accept();
                    clientProcessingPool.submit(new ClientTask(clientSocket));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    Thread serverThread = new Thread(serverTask);
    serverThread.start();

}

private class ClientTask implements Runnable {
    private Socket clientSocket;

    private ClientTask(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }


    @Override
    public void run() {

        try {
            // Read request
            InputStream incommingIS = clientSocket.getInputStream();
            byte[] b = new byte[8196];
            int len = incommingIS.read(b);

            if (len > 0) {
                System.out.println("REQUEST"
                        + System.getProperty("line.separator") + "-------");
                System.out.println(new String(b, 0, len));

                // Write request
                Socket socket = new Socket("localhost", 80);
                OutputStream outgoingOS = socket.getOutputStream();
                outgoingOS.write(b, 0, len);

                // Copy response
                OutputStream incommingOS = clientSocket.getOutputStream();
                InputStream outgoingIS = socket.getInputStream();
                for (int length; (length = outgoingIS.read(b)) != -1;) {
                    incommingOS.write(b, 0, length);
                }

                incommingOS.close();
                outgoingIS.close();
                outgoingOS.close();
                incommingIS.close();

                socket.close();
            } else {
                incommingIS.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
}

我做错了什么?有人能帮我吗


谢谢

您假设在一次读取中获得了整个请求,而不是使用类似于响应循环的循环

您还假设它是由流的末尾终止的,这意味着客户端必须执行了shutdownOutput(),这在大多数协议中都不会发生


一般来说,这不是编写代理的正确方法。您需要为每个客户端启动两个线程,同时在两个方向复制数据,并推迟关闭套接字,直到您从两个方向读取EOS。

您假设在一次读取中获得了整个请求,而不是使用类似于响应循环的循环

您还假设它是由流的末尾终止的,这意味着客户端必须执行了shutdownOutput(),这在大多数协议中都不会发生


一般来说,这不是编写代理的正确方法。您需要为每个客户端启动两个线程,同时在两个方向上复制数据,并推迟关闭套接字,直到您从两个方向读取EOS。

Hi,您说在两个方向上复制数据是什么意思?我不明白我该怎么做…我告诉过你了。每个连接有两个线程。一个是向一个方向复制,另一个是向另一个方向复制。嗨,你说向两个方向复制数据是什么意思?我不明白我该怎么做…我告诉过你了。每个连接有两个线程。一个在一个方向复制,一个在另一个方向复制。