如何将流量从端口 443 和 80 重定向到我的 heroku app dyno?

How do I redirect traffic from port 443 and 80 to my heroky app dyno?

我已经在 heroku 上安装了 java 应用程序。它需要从端口 443 和 80(heroku 上 public 的可用端口)获取流量,并需要对其进行处理并在一些操作后将其发送回客户端。如何将流量从端口 80 或 443 重定向到我的 java 应用程序?

客户端是连接到 heroku 的 netcat

nc [server-ip] [port]

端口由命令行参数
提供给java应用程序 java 应用代码:

import java.io.*;
import java.net.*;
import java.util.ArrayList;


public class Launcher {
    public static ArrayList<Thread> ClientThreads = new ArrayList<>();

    public static void main(String[] args) {
        System.out.println("Starting Listener");

        int port;
        ServerSocket listener = null;

        // Parse Arguments
        for (String arg: args) {
            if (arg.contains("-h")) {
                System.out.println("Usage: listener [port]");
                return;
            } else {
                try {
                    port = Integer.parseInt(arg);
                    listener = new ServerSocket(port);
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                    System.out.println("Invalid port");
                    return;
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("Port cannot be used. Try another port");
                    return;
                }
            }
        }

        try {
            int ThreadID = 0;
            while (true) {
                assert listener != null;
                Socket client = listener.accept();
                int finalThreadID = ThreadID;
                ClientThreads.add( new Thread(() -> HandleCon(client, finalThreadID), "Client-Thread-"+finalThreadID));
                ClientThreads.get(finalThreadID).start();
                ThreadID = ClientThreads.size() - 1;
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Some error occurred");
        }

    }

    public static void HandleCon(Socket Client, int Id) {
        try {
            System.out.println(Client.getInetAddress().getHostAddress() + " has connected");
            BufferedReader Reader = new BufferedReader(new InputStreamReader(Client.getInputStream()));
            PrintWriter Writer = new PrintWriter(Client.getOutputStream());
            while (true) {
                Writer.print("Enter a command: ");
                Writer.flush();
                String command = Reader.readLine();

                if (command.equalsIgnoreCase("exit")) {
                    System.out.println(Client.getInetAddress().getHostAddress() + " has disconnected");
                    Client.close();
                    break;
                }
                System.out.println(Client.getInetAddress().getHostAddress() + " -> " + command);
                Writer.println("You have entered " + command);
                Writer.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(Client.getInetAddress().getHostAddress() + " has disconnected");
        }

        ClientThreads.remove(Id);
    }
}

在 Heroku 上,您只能分配一个端口。您不能打开新端口,端口号是随机的,并且是 Heroku 通过环境变量给您的固定端口号。

端口 80 和 443 通常用于 http 和 https。根据您的应用程序,您可能只需绑定一个端口就可以了。

https://devcenter.heroku.com/articles/setting-the-http-port-for-java-applications

执行您的程序时,您需要将 $PORT 传递给您的应用程序,而不是指定固定端口号。

如果您的应用程序需要多个端口,请在此处回答类似的问题: