Java 当服务器和客户端位于不同的网络上时,如何使用AWS在它们之间进行通信?

Java 当服务器和客户端位于不同的网络上时,如何使用AWS在它们之间进行通信?,java,amazon-web-services,amazon-ec2,ssh,Java,Amazon Web Services,Amazon Ec2,Ssh,我正试图通过客户端程序与服务器建立基本连接。当我在同一个网络上运行我的客户机/服务器时,它工作正常,但当我的客户机程序在我的PC上,但我的服务器程序在EC2实例上时,我不知道从哪里开始 我已经在AWS上设置了一个EC2Linux实例,并将服务器代码加载到其中。客户端在我的电脑上 要运行服务器,我将使用: java问候服务器6000 要运行客户端,我将使用: java欢迎客户端6000 我是AWS和服务器-客户机通信的新手,所以如果你知道这方面的好教程,那就太好了 服务器代码: // File N

我正试图通过客户端程序与服务器建立基本连接。当我在同一个网络上运行我的客户机/服务器时,它工作正常,但当我的客户机程序在我的PC上,但我的服务器程序在EC2实例上时,我不知道从哪里开始

我已经在AWS上设置了一个EC2Linux实例,并将服务器代码加载到其中。客户端在我的电脑上

要运行服务器,我将使用:
java问候服务器6000

要运行客户端,我将使用:
java欢迎客户端6000

我是AWS和服务器-客户机通信的新手,所以如果你知道这方面的好教程,那就太好了

服务器代码:

// File Name GreetingServer.java
import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
   private ServerSocket serverSocket;

   public GreetingServer(int port) throws IOException {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

   public void run() {
      while(true) {
         try {
            System.out.println("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();

            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());

            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
               + "\nGoodbye!");
            server.close();

         } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
         } catch (IOException e) {
            e.printStackTrace();
            break;
         }
      }
   }

   public static void main(String [] args) {
      int port = Integer.parseInt(args[0]);
      try {
         Thread t = new GreetingServer(port);
         t.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}
客户端代码:

// File Name GreetingClient.java
import java.net.*;
import java.io.*;

public class GreetingClient {

   public static void main(String [] args) {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try {
         System.out.println("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);

         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);

         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);

         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

你犯了什么错误?您可能需要确保EC2实例的安全组允许端口6000上的传入连接。(可以在AWS UI中找到)。我得到的错误是:连接超时。我使用了默认的安全组,因此如果我没有弄错的话,它允许所有端口。我认为默认的SG只允许来自具有相同SG的服务器的传入连接。您可能需要专门为您的客户端IP打开端口(或为所有用户打开安全性较低的端口)。检查SG设置中的“源”字段。它就是这样的。添加了新端口,它正在工作!