java - 使用多线程套接字通过mTLS进行Java HTTP代理链接

标签 java sockets proxy

我正在尝试在本地监听套接字以用作HTTP代理,并将所有内容(TCP)转发到另一个受Mutual TLS保护的HTTP代理。
我环顾四周,但还没有找到可以帮助我实现这一目标的库,因此我选择了原始java.net.Socket。
但是,套接字和连接管理很麻烦,导致“套接字关闭”错误,并且在大多数情况下根本没有收到响应或连接重置。这是在两个Socket之间传递所有内容的正确方法吗?

public class ThreadServer
implements Runnable
{
    private final ServerSocket inSocket;
    private final SSLSocketFactory socketFactory;
    private final String proxyHost;
    private final int proxyPort;

    public ThreadServer(final SSLSocketFactory socketFactory,
                        final String proxyHost, final int proxyPort,
                        final ServerSocket inSocket)
    {
        this.proxyHost = proxyHost;
        this.proxyPort = proxyPort;
        this.socketFactory = socketFactory;
        this.inSocket = inSocket;
    }

    private void process(Socket acceptSocket, Socket sendSocket)
    throws IOException
    {
        try (final InputStream inFromClient = acceptSocket.getInputStream();
             final OutputStream outToClient = acceptSocket.getOutputStream();
             final InputStream inFromServer = sendSocket.getInputStream();
             final OutputStream outToServer = sendSocket.getOutputStream())
        {
            new Thread(() -> {
                try {
                    // can blocking indefinetely so run in a separate Thread
                    inFromClient.transferTo(outToServer);
                } catch (IOException ignored) {}
            }).start();

            // now copy everything from response back to the client, blocking as wel
            inFromServer.transferTo(outToClient);
        } finally {
            acceptSocket.close();
            sendSocket.close();
        }
    }

    @Override
    public void run()
    {
        while (true) {
            try {
                Socket socket = this.inSocket.accept();
                Socket tlsSocket = socketFactory.createSocket(
                SocketFactory.getDefault().createSocket(proxyHost, proxyPort), proxyHost, proxyPort, true);
                process(socket, tlsSocket);
            } catch (IOException ignored) {}
        }
    }
}

最佳答案

不,这不是正确的方法,因为服务器端套接字处理是一团糟。
使用(rest/soap service)库,例如jersey。其他库也将执行相同的工作。 ;-)
编辑:现在,我知道了。您需要一个TCP代理/TCP隧道。是的, Jersey 对您来说是错误的工具。但是有一些用Java写的TCP代理。 oksuz/tcp-proxy。我想在这里的其他人也要求相同,Java tunnel and tcp proxy
也许这可以帮助您。

关于java - 使用多线程套接字通过mTLS进行Java HTTP代理链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64040111/

相关文章:

c++ - Asio::async_connect 和 io_service.run 不编译

android - 如何在android中使用setRecommendedGlobalProxy

java - 如何考虑字符串中的数字对字符串进行排序?

python - 在python中获取已连接客户端的IP

java - 野蝇15 : Failed to process phase STRUCTURE of deployment

c - 套接字 - 在c中发送一个大字符串

Rust:如何使用 async-std + TLS + HTTP 代理(http 隧道)?

firefox - 如何使Firefox使用代理服务器进行本地主机连接

java - JOOQ 的 maven 配置有任何架构文档吗?

java - 如何在 java 类中获取 TextView 值作为字符串并设置它?