Java:如何在;正规的;TCP套接字和SSLSocket

Java:如何在;正规的;TCP套接字和SSLSocket,java,sockets,ssl,tcp,sslsocketfactory,Java,Sockets,Ssl,Tcp,Sslsocketfactory,编辑:删除startHandshake()因为它与问题无关且很少需要(例如,在我的情况下不需要) 我有一个非常特殊和罕见的客户端-服务器协议(通过TCP)。 我已经使用SSLSocket实现了它。 现在,我预见到我可能需要在未加密的连接上使用相同的协议 我的问题是实现该协议的类有一个字段:publicssslsocketcurrentsocket (然后我的客户机类中的方法执行各种.read()、.write()、flush()…) 我考虑过改变字段类型,比如:publicsocketcurre

编辑:删除
startHandshake()因为它与问题无关且很少需要(例如,在我的情况下不需要)

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

我的问题是实现该协议的类有一个字段:
publicssslsocketcurrentsocket

(然后我的客户机类中的方法执行各种
.read()、.write()、flush()…

我考虑过改变字段类型,比如:
publicsocketcurrentsocket

但是,问题是我的连接过程不兼容:

public static void connect () {
currentSocket = SslUtils.getSSLsocket(host, port, keystoreFile, keystorePass, pkPass);
...
  • 显然,java.net.Socket的默认构造函数不接受密钥库内容
我不想为了这个差异而重新实现我的整个客户端…

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

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


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

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

publicstaticvoidconnect(){
如果(需要LSocket){
sslsocketssl=SslUtils.getSSLsocket(主机、端口、keystoreFile、keystorePass、pkPass);
ssl.startHandshake();
...
currentSocket=ssl;
/*或:
currentSocket=SslUtils.getSSLsocket(主机、端口、keystoreFile、keystorePass、pkPass);
((SSLSocket)currentSocket).startAndShake();
...
*/
}否则{
currentSocket=新套接字(主机、端口);
}
...
}

(1)您可以编写自己的工厂来创建所需的套接字,(2)您不需要调用
startHandshake()
。你应该能够用
Socket
编写你的整个应用程序,而不是使用工厂方法,除非你正在做一些奇特的事情,比如会话失效或重新握手。@user207421我考虑过我自己的工厂,但这看起来太麻烦了。我得到了很好的用例。至于Startandshake,恐怕我是无知的囚徒。我不知道没有它如何连接SSL套接字。无论如何,谢谢你的宝贵意见
startHandshake()
在套接字的第一次I/O时自动调用。你不必自己称呼它。您只需要在需要重新设置会话密钥时调用它。@user207421是!我只是简单地说,握手和一切照常进行:)老实说,在开发我的客户时,我不得不处理很多事情,我没有质疑我能找到的每一条指导。在我的开发风格中,少做一件事意味着很多——谢谢你的测试和采纳。非常感谢。我只想添加一条关于startHandshake()的评论;好的,编辑被拒绝,但对于未来的读者:startHandshake(),如我的问题所示,它可能不是SSL套接字连接过程的重要组成部分,除非在极少数情况下。@DraxDomax“startHandshake();,如我的问题所示,与此无关”-那么您应该从一开始就将其完全排除在外。老实说,我认为可以将其保留在那里。因为,从客观的角度来看,另一个程序员可能实际上需要调用该方法,它显示了您无法在套接字对象上执行的操作,从而增加了桥接类型的动力。但我将被诅咒与40万人争论:)我将编辑。再次感谢你的帮助