如何指定 OkHttp 在建立新连接时使用哪个网络接口

mit*_*hik 5 java okhttp

OkHttp我在服务器上运行的应用程序中使用,并且服务器在操作系统级别配置了多个网络接口。

我如何控制 OkHttp 将使用哪个网络接口来发送新请求?

默认情况下,我看到它只是选择可用的接口之一,因为我希望为构建在 OkHttp 之上的应用程序的用户提供配置应使用的接口的能力。

Yur*_*mke 2

我相信你可以使用

https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#socketFactory-javax.net.SocketFactory-

public OkHttpClient.Builder socketFactory(SocketFactory socketFactory)
Run Code Online (Sandbox Code Playgroud)

设置用于创建连接的套接字工厂。OkHttp 仅使用无参数 createSocket() 方法来创建未连接的套接字。例如,重写此方法允许将套接字绑定到特定的本地地址。如果未设置,将使用系统范围的默认套接字工厂。

例如https://github.com/yschimke/okurl/blob/e307022667e2beb474309af5b350cd241f2a9045/src/main/kotlin/com/baulsupp/okurl/network/InterfaceSocketFactory.kt

class InterfaceSocketFactory(private val localAddress: InetAddress) : SocketFactory() {
  private val systemFactory = getDefault()

  override fun createSocket(): Socket {
    val s = systemFactory.createSocket()
    s.bind(InetSocketAddress(localAddress, 0))
    return s
  }
Run Code Online (Sandbox Code Playgroud)