如何将流量从端口 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
传递给您的应用程序,而不是指定固定端口号。
如果您的应用程序需要多个端口,请在此处回答类似的问题:
我已经在 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
传递给您的应用程序,而不是指定固定端口号。
如果您的应用程序需要多个端口,请在此处回答类似的问题: