【发布时间】: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