3

这是我的问题:

我想使用自签名证书在我的服务器上发出 HTTPS 请求。使用 Galaxy S2 (v4.0.3)、Nexus S (4.0.4)、Xperia Ray (4.0.3) 和 Galaxy Ace (2.3.6) 在 WLAN 中运行良好。

在 3G 中测试时,它仅适用于 Galaxy Ace 和 Xperia Ray。在其他人身上,我得到了一个Socket is closed: java.net.SocketException.

此页面上,我找到了解决方案。我有一个请求属性Connection : close。但是没有这个标题,我会得到一个不同的错误:Handshake timeout.

这些设备有什么不同才能获得这些不同的结果?

对于 https 请求,我使用javax.net.ssl包。我使用客户端私钥进行请求。

编辑:我使用其他 SIM 卡进行了测试,这很奇怪:使用一张,它适用于 Nexus S,但不适用于 Galaxy S。第二张,适用于所有人。我的结论是:一些运营商可能会限制特定的请求或数据传输。我不知道为什么,我会联系他们以获取更多信息

EDIT2: 此处的解决方案: 如何强制我的应用不使用 3g 数据代理设置

4

1 回答 1

3

根据您的编辑,此问题确实是由运营商代理设置引起的。

您的链接解决了我的问题,但花了一点时间弄清楚如何使用ProxySelector和 *Proxy.NO_PROXY*,所以我想我会在这里发布我的解决方案以确保完整性。

请注意,我将覆盖来自应用程序的所有 URI 尝试,如果您通过 Facebook SDK 之类的东西建立连接,并且不想自己破解,这将很方便。

ProxySelector proxySelector = new ProxySelector() {

        @Override
        public List<Proxy> select(URI uri) {
            List<Proxy> proxies = new ArrayList<Proxy>();
            proxies.add(Proxy.NO_PROXY);
            return proxies;
        }

        @Override
        public void connectFailed(URI uri, SocketAddress address,
                IOException failure) {
            // TODO Auto-generated method stub

        }
    };
    ProxySelector.setDefault(proxySelector);
于 2013-02-27T10:39:56.773 回答