如何使SSL服务器套接字同时支持http和;java中的https?

如何使SSL服务器套接字同时支持http和;java中的https?,java,sockets,sslsocketfactory,Java,Sockets,Sslsocketfactory,我正在尝试使用java套接字创建简单的web服务器,java套接字应该同时支持http和https。但是我一次只能做一个。我需要一个同时支持http@port 80和https@port 443的逻辑。 这是使用sslsocket的HTTPS服务器的示例代码。我们可以使用简单的ServerSocket实现HTTP服务器 public class HttpsServer { public static void main(String[] args) { try {

我正在尝试使用java套接字创建简单的web服务器,java套接字应该同时支持http和https。但是我一次只能做一个。我需要一个同时支持http@port 80和https@port 443的逻辑。
这是使用sslsocket的HTTPS服务器的示例代码。我们可以使用简单的ServerSocket实现HTTP服务器

public class HttpsServer {
    public static void main(String[] args) {
    try {
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(new FileInputStream("/opt/p12file.p12"), "p12pass".toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(ks, "p12pass".toCharArray());

        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(kmf.getKeyManagers(), null, null);

        SSLServerSocketFactory ssf = sc.getServerSocketFactory();
        SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(8080);

        while (true) {
            SSLSocket c = (SSLSocket) s.accept();
            BufferedWriter w = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
            w.write("HTTP/1.0 200 OK");
            w.newLine();
            w.write("Content-Type: text/html");
            w.newLine();
            w.newLine();
            w.write("<html><body><h1>Https Server Works</h1></body></html>");
            w.newLine();
            w.flush();
            w.close();
            c.close();
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
公共类HttpsServer{
公共静态void main(字符串[]args){
试一试{
KeyStore ks=KeyStore.getInstance(“PKCS12”);
load(新文件输入流(“/opt/p12file.p12”),“p12pass.tocharray());
KeyManagerFactory kmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks,“p12pass.toCharArray());
SSLContext sc=SSLContext.getInstance(“TLS”);
sc.init(kmf.getKeyManager(),null,null);
SSLServerSocketFactory ssf=sc.getServerSocketFactory();
sslserversockets=(SSLServerSocket)ssf.createServerSocket(8080);
while(true){
SSLSocket c=(SSLSocket)s.accept();
BufferedWriter w=新的BufferedWriter(新的OutputStreamWriter(c.getOutputStream());
w、 写入(“HTTP/1.0 200 OK”);
w、 换行符();
w、 编写(“内容类型:文本/html”);
w、 换行符();
w、 换行符();
w、 写入(“Https服务器工作”);
w、 换行符();
w、 冲洗();
w、 close();
c、 close();
}
}
捕获(例外e){
e、 printStackTrace();
}
}
}

谁能帮帮我吗

如何使SSL服务器套接字在java中同时支持http和https

你不能。HTTP是纯文本,
SSLServerSocket
无法支持

我正在尝试使用java套接字创建简单的web服务器,java套接字应该同时支持http和https。但我一次只能做到一个。我需要一个同时支持http@port 80和https@port 443的逻辑

你需要:

  • 纯文本
    ServerSocket
    在80
  • 一个
    SSLServerSocket
    在443监听
  • 每个线程都有一个接受循环线程
  • 每个已接受套接字的连接线程
您永远不会在静态
main()
方法中完成它。我建议您阅读Java教程的“自定义网络”部分,然后阅读JSSE参考指南

当然,您还需要仔细了解RFC2616HTTP1.1。正确地实现是非常重要的

正如评论中所建议的,你应该真正使用现成的东西。

你有两个选择:

  • 使用两个不同的端口,一个用于http,另一个用于https

  • SSL Hello检测/端口统一:

    在HTTP和HTTPS中,客户机应首先对话。因此,服务器可以使用它来检测客户端期望的协议:

    • 如果客户端发送TLS ClientHello,则继续进行TLS握手
    • 如果发送的是普通HTTP请求,则按原样处理请求

更多信息:


为什么不使用web容器?你真的想自己实现http协议吗?我想在android应用程序中实现这些功能@StevenPessallAn android应用程序用作HttpServer?老实说,这听起来像是一个混乱的系统设计。在android中,它不是一个成熟的HTTP服务器。只是一个简单的后台服务,它使用套接字在从浏览器发布内容时获取httpresponse。我分别实现了http服务器(基于socket)和https服务器(基于sslsocket)作为android应用程序。现在我想合并这些东西。谢谢@史蒂文佩萨尔