【问题标题】:How do I redirect traffic from port 443 and 80 to my heroky app dyno?如何将流量从端口 443 和 80 重定向到我的 heroku 应用 dyno?
【发布时间】:2020-06-06 12:07:26
【问题描述】:

我已经在 heroku 上设置了 java 应用程序。它需要从端口 443 和 80(heroku 上公开的可用端口)获取流量,并需要对其进行处理并在一些操作后将其发送回客户端。如何将流量从端口 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);
    }
}

【问题讨论】:

  • “如何将流量从端口 80 或 443 重定向到我的 java 应用程序?”——我不明白。假设您绑定到由PORT 环境变量提供的端口,来自这些端口的流量会自动路由到您的应用程序。
  • 克里斯,那是我不知道的部分。下面的答案回答了。

标签: java http heroku https port


【解决方案1】:

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

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

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

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

如果您的应用程序需要多个端口,类似问题已在此处得到解答:Heroku + node.js: I have a server which uses multiple ports. How can I get Heroku to allocate them?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 2015-08-07
    • 2021-12-03
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    相关资源
    最近更新 更多