运行 亚马逊 AWS 上的实时 Java 服务器
Running a live Java Server on Amazon AWS
我正在 Java 与其他几个程序员一起开发客户端-服务器应用程序。此时我不想 运行 在本地编写代码。我希望能够从任何机器连接到服务器。
我写了一个测试服务器和测试客户端,只是为了确保一切正常。但他们不是。我正在使用 Java 附带的 Amazon AWS EC2 Linux。在我通过 SSH 连接到 EC2 后,我能够编译和 运行 我的服务器,但是我本地磁盘上的客户端只是没有连接。这是代码。
// Code found online (https://cs.lmu.edu/~ray/notes/javanetexamples/)
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class TestServer {
public static void main(String[] args) throws Exception {
try (ServerSocket listener = new ServerSocket(50000)) {
System.out.println("The capitalization server is running...");
System.out.println(listener.getInetAddress());
ExecutorService pool = Executors.newFixedThreadPool(20);
while (true) {
pool.execute(new Capitalizer(listener.accept()));
}
}
}
private static class Capitalizer implements Runnable {
private Socket socket;
Capitalizer(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
System.out.println("Connected: " + socket);
try {
Scanner in = new Scanner(socket.getInputStream());
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
while (in.hasNextLine()) {
out.println(in.nextLine().toUpperCase());
}
} catch (Exception e) {
System.out.println("Error:" + socket);
} finally {
try { socket.close(); } catch (IOException e) {}
System.out.println("Closed: " + socket);
}
}
}
}
// Code found online (https://cs.lmu.edu/~ray/notes/javanetexamples/)
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class TestClient {
public static void main(String[] args) throws Exception {
try (Socket socket = new Socket("ADDRESS HERE", 50000)) {
System.out.println("Enter lines of text then Ctrl+D or Ctrl+C to quit");
Scanner scanner = new Scanner(System.in);
Scanner in = new Scanner(socket.getInputStream());
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
while (scanner.hasNextLine()) {
out.println(scanner.nextLine());
System.out.println(in.nextLine());
}
}
}
}
代替客户端中的"ADDRESS HERE",我尝试了我的Amazon EC2 实例的私有IP 和public IP。我也试过 public DNS 名称。似乎没有任何效果。只是没有从客户端到服务器的连接。事实上,"Enter lines of text then Ctrl+D or Ctrl+C to quit" 从不打印。
感谢所有帮助。谢谢。
由于您能够通过 SSH 连接到 EC2 实例,因此您的安全组允许这样做。
现在您需要允许来自此安全组中的客户端的请求。您需要提供具体的 IP、IP 范围或允许组中的所有 IP(不推荐)。
您可以找到如何执行此操作 here.
允许您的 IP 地址向 EC2 发送请求。为此,您需要转到您的安全组并在那里添加您的 IP。按照这些步骤-
- 转到您的 AWS 控制台。
- 单击 EC2,然后在资源下找到安全组。
- Select 你的安全组。
- 按照给定图像中的步骤操作。
我正在 Java 与其他几个程序员一起开发客户端-服务器应用程序。此时我不想 运行 在本地编写代码。我希望能够从任何机器连接到服务器。
我写了一个测试服务器和测试客户端,只是为了确保一切正常。但他们不是。我正在使用 Java 附带的 Amazon AWS EC2 Linux。在我通过 SSH 连接到 EC2 后,我能够编译和 运行 我的服务器,但是我本地磁盘上的客户端只是没有连接。这是代码。
// Code found online (https://cs.lmu.edu/~ray/notes/javanetexamples/)
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class TestServer {
public static void main(String[] args) throws Exception {
try (ServerSocket listener = new ServerSocket(50000)) {
System.out.println("The capitalization server is running...");
System.out.println(listener.getInetAddress());
ExecutorService pool = Executors.newFixedThreadPool(20);
while (true) {
pool.execute(new Capitalizer(listener.accept()));
}
}
}
private static class Capitalizer implements Runnable {
private Socket socket;
Capitalizer(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
System.out.println("Connected: " + socket);
try {
Scanner in = new Scanner(socket.getInputStream());
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
while (in.hasNextLine()) {
out.println(in.nextLine().toUpperCase());
}
} catch (Exception e) {
System.out.println("Error:" + socket);
} finally {
try { socket.close(); } catch (IOException e) {}
System.out.println("Closed: " + socket);
}
}
}
}
// Code found online (https://cs.lmu.edu/~ray/notes/javanetexamples/)
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class TestClient {
public static void main(String[] args) throws Exception {
try (Socket socket = new Socket("ADDRESS HERE", 50000)) {
System.out.println("Enter lines of text then Ctrl+D or Ctrl+C to quit");
Scanner scanner = new Scanner(System.in);
Scanner in = new Scanner(socket.getInputStream());
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
while (scanner.hasNextLine()) {
out.println(scanner.nextLine());
System.out.println(in.nextLine());
}
}
}
}
代替客户端中的"ADDRESS HERE",我尝试了我的Amazon EC2 实例的私有IP 和public IP。我也试过 public DNS 名称。似乎没有任何效果。只是没有从客户端到服务器的连接。事实上,"Enter lines of text then Ctrl+D or Ctrl+C to quit" 从不打印。
感谢所有帮助。谢谢。
由于您能够通过 SSH 连接到 EC2 实例,因此您的安全组允许这样做。
现在您需要允许来自此安全组中的客户端的请求。您需要提供具体的 IP、IP 范围或允许组中的所有 IP(不推荐)。
您可以找到如何执行此操作 here.
允许您的 IP 地址向 EC2 发送请求。为此,您需要转到您的安全组并在那里添加您的 IP。按照这些步骤-
- 转到您的 AWS 控制台。
- 单击 EC2,然后在资源下找到安全组。
- Select 你的安全组。
- 按照给定图像中的步骤操作。