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);
...
- java.net.Socket 的默认构造函数显然不接受密钥库内容
我不想为了这个区别而重新实现我的整个客户端...
我的一个想法是,当我需要一个明文套接字时,创建一个没有加密的 SSLSocket。
我不知道这是否是一种专业的方法,或者它是否会起作用(服务器将在新用例中期望明文客户端套接字)
我的另一个想法是定义两个字段,一个用于纯文本套接字,一个用于 SSL 套接字,然后使用逻辑 link in/out 流到正确的字段,如所须。但是,这将导致 "hanging" 字段。如果您使用 SSL,将有一个冗余字段 Socket plaintextSocket
反之亦然...
有没有办法让我的 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);
}
...
}
编辑:已删除 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);
...
- java.net.Socket 的默认构造函数显然不接受密钥库内容
我不想为了这个区别而重新实现我的整个客户端...
我的一个想法是,当我需要一个明文套接字时,创建一个没有加密的 SSLSocket。
我不知道这是否是一种专业的方法,或者它是否会起作用(服务器将在新用例中期望明文客户端套接字)我的另一个想法是定义两个字段,一个用于纯文本套接字,一个用于 SSL 套接字,然后使用逻辑 link in/out 流到正确的字段,如所须。但是,这将导致 "hanging" 字段。如果您使用 SSL,将有一个冗余字段
Socket plaintextSocket
反之亦然...
有没有办法让我的 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);
}
...
}