Java: 如何在"regular" TCP Socket 和 SSLSocket 之间进行抽象

Java: How to abstract between "regular" TCP Socket and SSLSocket

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

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

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

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

public static void connect () {
currentSocket = SslUtils.getSSLsocket(host, port, keystoreFile, keystorePass, pkPass);
...

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

有没有办法让我的 currentSocket 字段更抽象,这样我就可以在同一个客户端中定义它,然后根据已知变量指示稍微不同的客户端代码路径(类似于 needSSLsocket=true) 用于实例化和连接?

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);
    }
    ...
}