当前位置: 首页 > 知识库问答 >
问题:

小程序中的Netty和代理服务器

边翔宇
2023-03-14

我们在Java小程序中使用Netty与tomcat服务器通信。这很好用。

我可以使用下面发布的helper类获取代理信息。

我的问题是如何向Netty提供代理服务器信息?

更多信息:

我们有一个用户在Internet Explorer中配置了代理服务器。网页和Java小程序被提供,但是当Netty试图连接时,它绕过代理服务器并进行直接连接;这失败了,因为用户设置了防火墙来防止直接连接——所有客户端连接都必须通过代理服务器。

获取代理信息的帮助程序代码:

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.net.URL;
import java.util.Iterator;
import java.util.List;

public class ProxyConfig {

    private static final String JAVA_NET_USE_SYSTEM_PROXIES = "java.net.useSystemProxies";
    private static String host;
    private static int port;
    private static String protUrlStr = null;

    public static void init(URL url) {
        // http://10.0.1.136
        protUrlStr = url.getProtocol() + "://" + url.getHost();
        System.setProperty(JAVA_NET_USE_SYSTEM_PROXIES, "true");
        Proxy proxy = getProxy();
        if(proxy != null) {
            InetSocketAddress addr = (InetSocketAddress) proxy.address();
            if(addr != null) {
                host = addr.getHostName();
                port = addr.getPort();
                System.setProperty(JAVA_NET_USE_SYSTEM_PROXIES, "false");
                System.setProperty("http.proxyHost", host);
                System.setProperty("http.proxyPort", port + "");
            }
        }
        System.setProperty(JAVA_NET_USE_SYSTEM_PROXIES, "false");
    }

    public static String getHost() {
        return host;
    }

    public static int getPort() {
        return port;
    }

    private static Proxy getProxy() {
        List<Proxy> l = null;
        try {
            ProxySelector def = ProxySelector.getDefault();
            System.out.println("Getting List<Proxy> for URL = " + protUrlStr);
            l = def.select(new URI(protUrlStr));
            ProxySelector.setDefault(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if(l != null) {
            for(Iterator<Proxy> iter = l.iterator(); iter.hasNext();) {
                java.net.Proxy proxy = iter.next();
                return proxy;
            }
        }
        return null;
    }
}

共有1个答案

越英韶
2023-03-14

谢谢你非常详细的问题。HTTP和SOCKS代理支持尚未集成到Netty中。Netty 3.6.2支持SOCKS,但它仅作为编解码器提供,因此您需要稍微调整一下,使其工作透明。

目前缺乏适当的代理支持与JavaNIO的工作方式有关,尽管Netty肯定能够将代理支持集成到其核心。如果有人愿意贡献,Netty项目团队将非常乐意审查并接受贡献。

如果要仅使用Netty发送HTTP请求,则可能需要提供一个基于Netty的专用HTTP客户端库,该库支持代理,例如AsyncHttpClient。

 类似资料:
  • 我已经阅读了netty代理服务器示例。但是,我想知道如何实现一个与代理对话的客户端。我正在实现的解决方案是服务器,每当客户端连接到服务器时,它都需要连接到套接字服务器。因此,连接到服务器的每个客户端都能够从另一台服务器发送/接收数据。 我需要帮助用netty实现这样的体系结构,因为服务器端是在netty上构建的。

  • netty文档讨论TCP客户端。 但对UDP来说,这句话似乎无关紧要?!我找到了仅使用引导程序的UDP服务器的示例,如:1,2,3 我对此感到很困惑,所以我的两个问题是: null

  • 如果我对Netty server的理解是正确的,那么主boss事件循环线程池(默认大小为2*AvailableProcessor)接受客户端连接,然后将请求处理工作卸载到工作线程。 现在,我的问题是,工作线程的线程池大小应该是多少?如果工作线程正在执行一些阻塞操作,例如等待网络调用响应,那么工作线程池是否应该足够大(例如200个线程)来处理并发客户端请求,因为每个工作线程都被阻塞以服务客户端请求?

  • 我有一个在Netty中实现的服务器,它工作得很好,但现在我试图优化一个方面。 传入通道是多路复用的,即每个客户机进程都有许多线程,通过一个连接发送请求并读取响应到服务器。 谢谢, 安迪。

  • 我正在尝试使用NettyV4编写代理服务器。0.30. 我已经浏览了发布中包含的代理示例(http://netty.io/4.0/xref/io/netty/example/proxy/package-summary.html).不过我的要求有点不同。 在我的例子中,我的netty实例后面可能有多个服务器,所以我不能直接在ChannelActive方法中创建客户端引导。我的客户端基本上发送两个请求

  • 我正在将本地netty服务器连接到远程https服务器以代理请求。 下面是我如何创建ssLcontext bean 当我点击我的本地主机时,它应该代理到后端。我得到以下异常。但是,如果SSL关闭并且我连接到远程,这是在不同端口上运行的本地服务器,则工作正常 编辑 添加的日志