Как перенаправить трафик c с портов 443 и 80 на мое приложение Heroky App Dyno? - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть настройка java приложения на героку. Он должен получить трафик c из портов 443 и 80 (доступные порты для публикации c на heroku) и должен обработать его и отправить обратно клиенту после некоторой операции. Как перенаправить трафик c с порта 80 или 443 на мое приложение java?

Клиент подключается по сети netcat к heroku

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);
    }
}

1 Ответ

2 голосов
/ 22 февраля 2020

В Heroku вы можете назначить только один порт. Вы не можете открыть новые порты, и номер порта является случайным и фиксированным, предоставленным вам Heroku через переменную среды.

Порты 80 и 443 обычно предназначены для http и https. В зависимости от вашего приложения вы можете быть в порядке, просто привязав один порт.

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

При выполнении вашей программы вам нужно передать $PORT вашему приложению вместо указания фиксированных номеров портов.

Если вам нужно иметь несколько портов для вашего приложения, на этот же вопрос был дан ответ: Heroku + node.js: у меня есть сервер, который использует несколько портов. Как я могу заставить Heroku распределить их?

...