OkHttp

时间:2015-05-08 07:46:10

标签: okhttp

我们目前在自定义负载测试框架中使用Apache Httpclient。我必须实现对WebSocket测试的支持,并且由于HttpClient不支持WebSockets,我正在寻找替代方案。所以,我一直在玩OkHttpAsync Http Client。一般来说,我可以同时使用它们作为替代品,但任何一个都给我一些我需要解决的挑战。这是我与OkHttp面对的那些人:

  • OkHttp在com.squareup.okhttp.internal.Internal中使用全局静态,这对我来说似乎有些可怕。在我们的框架中,我们启动了许多线程,这些线程又执行我们称之为请求流的线程。每个线程都会获得自己的HttpClient实例。看来,使用OkHttp,您不能在一个VM中拥有多个独立的OkHttpClient实例,因为它们会因静态内容而干扰。我似乎能够通过使用一个OkHttpClient实例和一个委托给线程范围的CookieHandler的CookieHandler来解决这个问题。我可能不得不对ConnectionPools做同样的事情。我在这里走在正确的轨道上吗?
  • 我需要能够设置本地地址。我们的客户端计算机具有多个NIC,必须均匀使用。 Apache HttpClient和AsyncHttpClient没有问题。如何用OkHttp完成?

更新/解决方案:

在杰西发表评论后再次挖掘代码,我意识到Internal单身人士没有保持状态。我想我只是因为我在代码库中找到了一个单身,即使它没有造成任何伤害,我也很恼火。

我可以使用Jesse建议的自定义套接字工厂设置本地地址:

public class LocalAddressSocketFactory extends SocketFactory {
    private static final String ERROR_MSG = "On unconnected sockets are supported";

    private final SocketFactory delegate;
    private final Provider<InetAddress> localAddressProvider;

    public LocalAddressSocketFactory(final SocketFactory delegate, 
            final Provider<InetAddress> localAddressProvider) {
        this.delegate = delegate;
        this.localAddressProvider = localAddressProvider;
    }

    @Override
    public Socket createSocket() throws IOException {
        Socket socket = delegate.createSocket();
        socket.bind(new InetSocketAddress(localAddressProvider.get(), 0));
        return socket;
    }

    @Override
    public Socket createSocket(final String remoteAddress, final int remotePort) 
            throws IOException, UnknownHostException {
        throw new UnsupportedOperationException(ERROR_MSG);
    }

    @Override
    public Socket createSocket(final InetAddress remoteAddress, final int remotePort) 
            throws IOException {
        throw new UnsupportedOperationException(ERROR_MSG);
    }

    @Override
    public Socket createSocket(final String remoteAddress, final int remotePort, 
            final InetAddress localAddress, final int localPort)
            throws IOException, UnknownHostException {
        throw new UnsupportedOperationException(ERROR_MSG);
    }

    @Override
    public Socket createSocket(final InetAddress remoteAddress, final int remotePort, 
            final InetAddress localAddress, final int localPort)
            throws IOException {
        throw new UnsupportedOperationException(ERROR_MSG);
    }
}

这个类依赖于OkHttp只创建未连接套接字的事实。如果可以记录下来,我会很感激。 OkHttpClient允许设置自定义SocketFactory,但您必须自己查明它是如何使用的。我刚刚提交了一个增强Javadocs的拉取请求:https://github.com/square/okhttp/pull/1626

0 个答案:

没有答案