我可以在HTTP和https会话中都使用SSLServerSocket类并侦听一个端口(通过自动检测,客户端附带HTTP还是https)?还是必须打开两个端口并将SSLServerSocket用于https和ServerSocket用于http?
谢谢
解决方法:
您尝试做的事情称为端口统一.例如implemented in Grizzly.
您实际上不能直接使用SSLServerSocket来侦听HTTP和HTTPS通信,因为它会在读取时立即开始握手,但是您可以使用普通的ServerSocket,接受普通的Socket,并尝试检测何时获得TLS客户端向您好或HTTP请求,方法是先读取前几个字节,然后读取convert it to an SSLSocket
.
我不能说我已经尝试过使用Sockets,但是您需要一些内容来提前阅读TLS客户端Hello,并在必要时将其推回possibly using a PushBackInputStream
, as suggested by EJP.
(据我所知,Grizzly为此使用SSLEngine而不是SSLSocket.)
请注意,使用端口统一是非常不寻常的.我不确定继续阅读的开销是多少.使用多个端口通常不是问题(此外,HTTP和HTTPS具有不同的默认端口,因此您必须至少在两个URL中指定一个端口).