设置Proxy访问网络

转自:http://www.devdiv.com/Android-%E8%AE%BE%E7%BD%AEProxy%E8%AE%BF%E9%97%AE%E7%BD%91%E7%BB%9C-thread-128977-1-1.html

      Android应用程序访问互联网资源时,在Wifi的情况下处理网络连接按照上文所讲述的方法步骤即可顺利实现;但如果当前Android设备的联网方式是通过移动运营商的网络服务为中转,间接访问的互联网资源时,则就涉及到在创建HTTP链接之前需要设置Proxy,即可尽量避免网络中断访问的情况,顺利访问互联网。


        Proxy中文即代理。已经插入手机卡的Android设备,点击"设置"→"无线和网络"→"移动网络设置"→"接入点名称",任意点击一接入点,此时显示的内容即为当前运营商为使Android设备通过运营商网络顺利接入互联网而需要设置的代理信息。

        通常,中国移动的接入点为CMWAP,代理IP是10.0.0.172,端口为80。

        由于不同运营商其代理设置的不同,为保证代码的一致性及有效性,开发过程中需要封装出能够自适应各种不同Proxy环境并且能够顺利访问互联网的联网代码。

        封装后的方法为openUrl(),代码如下:

public static HttpURLConnection openUrl(Context context, String urlStr) {
        URL urlURL = null;
        HttpURLConnection httpConn = null;
        try {
                urlURL = new URL(urlStr);
                // 需要android.permission.ACCESS_NETWORK_STATE
                // 在没有网络的情况下,返回值为null。
                NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE))
                                .getActiveNetworkInfo();
                // 如果是使用的运营商网络
                if (networkInfo != null) {
                        if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                                // 获取默认代理主机ip
                                String host = android.net.Proxy.getDefaultHost();
                                // 获取端口
                                int port = android.net.Proxy.getDefaultPort();
                                if (host != null && port != -1) {
                                        // 封装代理連接主机IP与端口号。
                                        InetSocketAddress inetAddress = new InetSocketAddress(host, port);
                                        // 根据URL链接获取代理类型,本链接适用于TYPE.HTTP
                                        java.net.Proxy.Type proxyType = java.net.Proxy.Type.valueOf(urlURL.getProtocol().toUpperCase());
                                        java.net.Proxy javaProxy = new java.net.Proxy(proxyType, inetAddress);
                                        httpConn = (HttpURLConnection) urlURL.openConnection(javaProxy);
                                } else {
                                        httpConn = (HttpURLConnection) urlURL.openConnection();
                                }
                        } else {
                                httpConn = (HttpURLConnection) urlURL.openConnection();
                        }
                        httpConn.setConnectTimeout(Const.NETWORK_OPEN_TIMEOUT);
                        httpConn.setReadTimeout(Const.NETWORK_READ_TIMEOUT);
                        httpConn.setDoInput(true);
                } else {
                        // LogOut.out(this, "No Avaiable Network");
                }
        } catch (NullPointerException npe) {
                npe.printStackTrace();
        } catch (MalformedURLException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace();
        }
        return httpConn;
}
 由于需要设置Proxy的情况为使用运营商网络,所以代码一开始即使用通过Context获得ConnectivityManager,执行ConnectivityManager.getActiveNetworkInfo()获取当前可用的网络。在有可用网络的情况下,判断其类型,如果networkInfo.getType()返回值为ConnectivityManager.TYPE_MOBILE,则需要设置Proxy;在返回值为ConnectivityManager.TYPE_WIFI的情况下则跳过设置Proxy的步骤。

        对HttpURLConnection设置Proxy需要指定代理IP及端口号,android.net.Proxy解决了这个问题。执行Proxy.getDefaultHost()和Proxy.getDefaultPort()将返回代理主机的IP及开放端口号,并以这两个信息传参构造InetSocketAddress。InetSocketAddress为IP套接地址,其主要形式可由IP地址与端口号组合而成,亦可用主机域名加端口号组合而成,这种情况下将尝试将主机域名解析为IP地址。

        封装的方法openUrl()两个参数中第二个参数为网络链接地址,将该地址构造出URL实例后,使用URL.getProtocol()方法即可知该链接地址所使用的协议类型。使用得到的链接协议类型,执行java.net.Proxy.Type的valueOf()方法进一步得到所需Proxy.Type。

        在InetSocketAddress及Proxy.Type确定的情况下,即可构造java.net.Proxy实例,执行代码为new java.net.Proxy(proxyType, inetAddress)。将新生成的Proxy对象做为参数,执行URL.openConnection(javaProxy),即可得到使用Proxy设置连接互联网的HttpURLConnection。

### 如何在 LangChain 中配置代理 (Proxy) LangChain 是一种用于构建基于大型语言模型的应用程序的框架。虽然 LangChain 自身并不直接提供内置的代理设置功能,但它依赖于 Python 的标准库和其他第三方库来处理网络请求(例如 `requests` 或 `httpx`)。因此,在 LangChain 配置中设置代理可以通过调整这些底层库的行为实现。 以下是具体方法: #### 方法一:通过环境变量设置代理 Python 应用通常会读取操作系统的环境变量以获取代理设置。这适用于大多数情况下使用的 HTTP 和 HTTPS 请求。 ```bash export http_proxy=http://your-proxy-server:port export https_proxy=http://your-proxy-server:port ``` 如果需要排除某些地址不走代理,则可以设置 `no_proxy` 变量[^2]: ```bash export no_proxy="localhost,127.0.0.1" ``` 上述命令可以直接应用于终端或脚本文件中。当运行 LangChain 项目时,它将自动继承这些环境变量并应用到其内部的网络请求中[^1]。 #### 方法二:手动修改 Requests 库中的代理设置 对于更复杂的场景或者无法全局更改环境变量的情况,可以在代码层面显式指定代理参数给 `requests.Session()` 对象。由于 LangChain 很可能间接调用了该库来进行 API 调用或其他外部通信,所以这种方法同样有效。 下面是一个例子展示如何创建带自定义代理支持的新 session 并将其传递至任何接受 requests 参数的地方: ```python import os from langchain import OpenAI, PromptTemplate, LLMChain proxies = { 'http': os.getenv('http_proxy', ''), 'https': os.getenv('https_proxy', '') } session = requests.Session() session.proxies.update(proxies) llm = OpenAI(requests_session=session) template = """Question: {question}""" prompt_template = PromptTemplate(input_variables=["question"], template=template) chain = LLMChain(llm=llm, prompt=prompt_template) response = chain.run(question="What is the capital of France?") print(response) ``` 此段代码片段展示了如何利用 `requests.Session` 来管理代理连接,并进一步集成到 LangChain 流程之中。 #### 方法三:防火墙端口开放确认 另外需要注意的是,如果你处于企业级环境中,除了正确设定客户端侧的代理外,还应确保服务器上的防火墙允许必要的流量进出。比如前面提到过的 CentOS/Fedora 系统上常见的 firewalld 工具链,可通过如下指令永久开启特定范围内的 TCP/UDP 连接[^3]: ```bash sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp sudo firewall-cmd --reload ``` 这样做的目的是为了防止即使设置了正确的代理也因为本地安全策略而被阻断访问路径。 --- ### 总结 综上所述,针对 LangChain 的代理配置主要分为三个层次考虑:一是操作系统级别的环境变量注入;二是深入源码层面对所依赖的基础组件做针对性改造;三是检查物理网络条件下的实际可达性状况。以上三种方式结合起来能够很好地解决大部分跨网域资源抓取的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值