Java:如何在“常规” TCP套接字和SSLSocket之间进行抽象

问题描述 投票:2回答:1

编辑:已删除startHandshake();,因为它与问题无关并且很少需要(例如,对于我而言不是)

我有一个相当具体且罕见的客户端-服务器协议(通过TCP)。我已经使用SSLSocket实现了它。现在,我预见到我可能需要在未加密的连接上使用相同的协议。

我的问题是,实现协议的类具有一个字段:public SSLSocket currentSocket;(然后,我的客户端类中的方法会执行各种.read(), .write(), flush()...

我曾考虑过更改字段类型,例如:public Socket currentSocket;但是,问题是我的连接过程不兼容:

public static void connect () {
currentSocket = SslUtils.getSSLsocket(host, port, keystoreFile, keystorePass, pkPass);
...
  • java.net.Socket的默认构造函数显然不接受密钥库的东西

我不想仅仅为了这种区别而重新实现我的整个客户...

  • 我有一个想法是,当我需要纯文本套接字时,可以创建不加密的SSLSocket。我不知道这是否是一种专业的方法,或者它是否还能工作(服务器在新的用例中会期望使用纯文本客户端套接字)

  • 我的另一种想法是定义两个字段,一个用于明文套接字,一个用于SSL套接字,然后根据需要使用逻辑将输入/输出流链接到正确的字段。但是,这将导致“挂起”字段。如果使用SSL,将有一个冗余字段Socket plaintextSocket,反之亦然...

是否有一种方法可以使我的currentSocket字段更抽象,以便我可以在同一客户端中对其进行定义,然后根据已知变量(类似于needSSLsocket=true之类)来指示稍微不同的客户端代码路径和连接?

java sockets ssl tcp sslsocketfactory
1个回答
2
投票

SSLSocket扩展了Socket,因此您可以将SSLSocket对象分配给Socket变量。您将currentSocket字段更改为Socket是正确的。只需在需要时使用另一个变量来处理SSLSocket,例如:

public static void connect () {
    if (needSSLsocket) {
        SSLSocket ssl = SslUtils.getSSLsocket(host, port, keystoreFile, keystorePass, pkPass);
        ssl.startHandshake();
        ...
        currentSocket = ssl;

        /* or:
        currentSocket = SslUtils.getSSLsocket(host, port, keystoreFile, keystorePass, pkPass);
        ((SSLSocket) currentSocket).startHandshake();
        ...
        */
    } else {
        currentSocket = new Socket(host, port);
    }
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.