TcpConnectionFactoryFactoryBean: используется как SslContextSupport, так и SocketFactorySupport - PullRequest
0 голосов
/ 14 февраля 2019

Я использую TcpConnectionFactoryFactoryBean (для клиентских подключений, не входящих в NIO) и хотел бы изменить мои подключения SSL Socket двумя способами:

1 / использовать только протокол TLS1.2 Я делаю это, вызывая TcpConnectionFactoryFactoryBean.setSslContextSupport () и предоставляя DefaultTcpSSLContextSupport объект с установленным протоколом TLSv1.2.

и

2 установить время ожидания подключения к сокету Я делаю это, вызывая TcpConnectionFactoryFactoryBean.setSocketFactorySupport () и предоставляя настроенный подкласс TcpSocketFactorySupport , который создает сокет и затем применяет время ожидания при вызове соединения,Эта техника задокументирована здесь .

Я работаю независимо, но не могу заставить их работать вместе.Глядя на код TcpConnectionFactoryFactoryBean, становится ясно, что метод receiveSocketFactorySupport () выберет только один.Поэтому я считаю, что мой подход неверен.Кто-нибудь может предложить какое-либо руководство?

1 Ответ

0 голосов
/ 14 февраля 2019

Думаю, у меня все работает, объединяя в один класс SocketFactorySupport, который подклассы DefaultTcpNetSSLSocketFactorySupport , а затем используют с вызовом TcpConnectionFactoryFactoryBean.setSocketFactorySupport () .Мой подкласс выглядит следующим образом, передайте DefaultTcpSSLContextSupport (с установленным протоколом) и время ожидания в конструкторе:

public class MySSLSocketFactorySupport extends DefaultTcpNetSSLSocketFactorySupport {

    private final int connectTimeout;

    public MySSLSocketFactorySupport(TcpSSLContextSupport sslContextSupport, int connectTimeout) {
        super(sslContextSupport);
        this.connectTimeout = connectTimeout;
    }

    @Override
    public ServerSocketFactory getServerSocketFactory() {
        throw new UnsupportedOperationException("This does not support server sockets");
    }

    @Override
    public SocketFactory getSocketFactory() {
        return new PostilionSocketFactory();
    }

    private class PostilionSocketFactory extends SocketFactory {

        private final SocketFactory delegate = MySSLSocketFactorySupport.super.getSocketFactory();

        @Override
        public Socket createSocket() throws IOException {
            return delegate.createSocket();
        }

        @Override
        public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
            Socket socket = this.delegate.createSocket();
            socket.connect(new InetSocketAddress(host, port), connectTimeout);
            return socket;
        }

        @Override
        public Socket createSocket(InetAddress host, int port) throws IOException {
            Socket socket = this.delegate.createSocket();
            socket.connect(new InetSocketAddress(host, port), connectTimeout);
            return socket;
        }

        @Override
        public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
            Socket socket = this.delegate.createSocket();
            socket.bind(new InetSocketAddress(localHost, localPort));
            socket.connect(new InetSocketAddress(host, port), connectTimeout);
            return socket;
        }

        @Override
        public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
            Socket socket = this.delegate.createSocket();
            socket.bind(new InetSocketAddress(localAddress, localPort));
            socket.connect(new InetSocketAddress(address, port), connectTimeout);
            return socket;
        }

    }

}
...