Привязка сокета по URL.openconnection () - PullRequest
2 голосов
/ 05 августа 2020

JRE 8 \

Как выбрать IP-адрес, с которого будет запускаться этот запрос? Сервер имеет несколько привязанных к нему IP-адресов, несколько интерфейсов. Я хочу использовать конкретный c один для этого запроса.

У меня httpsurlconnection.

URL url = new Url("x");
HttpsUrlConnection connection = (HttpsUrlConnection) url.openConnection();
...
connection.setSSLSocketFactory(SSLSocketFactory);
connection.connect();

Я переопределил в SSLSocketFactory все createSocket с IP-адресом источника привязки, который я выбрал. Проблема в том, что я:

URL url = new Url("x");
HttpsUrlConnection connection = (HttpsUrlConnection) url.openConnection();
...
connection.setSSLSocketFactory(SSLSocketFactory);
connection.connect();

Я вижу, что сокет создан, и моя sslsocketfactory использует createSocket с созданным сокетом. Затем я могу привязать к другому IP-адресу, но я хочу переопределить исходный IP-адрес при openConnection. Где я могу его переопределить?

URL url = new Url("x");
HttpsUrlConnection connection = (HttpsUrlConnection) url.openConnection();
...
connection.setSSLSocketFactory(SSLSocketFactory);
//connection.connect();

Если я удалю «connect ()», он не будет использовать sslsocketfactory, а только openConnection. И попробуйте подключиться к серверу со случайным исходным IP-адресом.

1 Ответ

1 голос
/ 06 августа 2020
HttpsUrlConnection

с использованием

SSLSocketFactory.createSocket();

Замените это на что-то вроде

Factory extends SSLSocketFactory{
    private SSLSocketFactory basicFactory;

    Factory(SSLSocketFactory basicFactory){
        this.basicFactory = basicFactory;
    }
...
    @Override
    public Socket createSocket() throws IOException {
        Socket socket = basicFactory.createSocket();
        socket.bind(sourceIpAddress);
        return socket;
    }
}

Не используйте super.createSocket (), потому что он вызовет SocketException ("Несоединенные сокеты не реализованы "), который будет перехвачен в HttpsClient и использовать NetworkClient для создания сокета с java. net .Socket со случайным исходным IP-адресом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...