Не удается подключить удаленный TCP-клиент к TCP-серверу на виртуальном устройстве Android - PullRequest
0 голосов
/ 10 апреля 2019

Я могу создать сокетное соединение между простым TCP-клиентом на локальном хосте и простым TCP-сервером в приложении AVD Android.

AVD работает за виртуальным маршрутизатором, и для подключения к AVD мне нужно настроить переадресацию портов на виртуальном маршрутизаторе, что я делаю так:

adb -s emulator-5554forward tcp: 5000 tcp: 6000

Вот простая клиентская программа TCP, которая запускается на локальном хосте 127.0.0.1 и подключается к серверу AVD, который прослушивает порт 6000

public class SimpleTcpClient
{
   public static void main(String argv[]) throws Exception
   {
      String host = "127.0.0.1";
      //String host = "10.9.2.121";
      int port = 5000;

      String sentenceToServer = "hello server";

      Socket clientSocket = new Socket(host, port);
      DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
      BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
      outToServer.writeBytes(sentenceToServer+"\n" );
      String serverResponse = inFromServer.readLine();
      clientSocket.close();
   }
}

Вот метод инициализации сервера, на котором запущено приложение в эмуляторе Android, который прослушивает порт 6000

private void initTcpTestServer()
{
  Log.d("TAG", "initTcpTestServer()");

  try
  {

     String clientSentence;
     ServerSocket welcomeSocket = new ServerSocket(6000);
     welcomeSocket.setReuseAddress(true);

     while ( true )
     {
        Socket connectionSocket = welcomeSocket.accept();
        BufferedReader inFromClient = new BufferedReader(
              new InputStreamReader(connectionSocket.getInputStream()));
        DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
        clientSentence = inFromClient.readLine();
        clientSentence = "hello client";
        outToClient.writeBytes(clientSentence + "\n");
     }
  }
  catch ( IOException e )
  {
     e.printStackTrace();
  }
}

Если я запускаю SimpleTcpClient на локальном хосте 127.0.0.1, я могу создатьсокетное соединение.Но как только я пытаюсь запустить SimpleTcpClient на другом компьютере, я получаю

Exception in thread "main" java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at com.slacorp.eptt.android.testclient.SimpleTcpClient.main(SimpleTcpClient.java:22)

, единственное изменение, которое я делаю, это SimpleTcpClient - это изменение целевого IP-адреса с локального хоста 127.0.0.1 на 10.9.2.121

public class SimpleTcpClient
{
   public static void main(String argv[]) throws Exception
   {
      //String host = "127.0.0.1";
      String host = "10.9.2.121";
      int port = 5000;

      String sentenceToServer = "hello server";
      System.out.println("initializing socket");

      Socket clientSocket = new Socket(host, port);
      DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
      BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
      outToServer.writeBytes(sentenceToServer+"\n" );
      String serverResponse = inFromServer.readLine();
      clientSocket.close();
   }
}

SimpleTcpClient не будет подключаться к серверу на AVD, но если я заставлю сервер работать на 10.9.2.121, так что сервер не находится на AVD за виртуальным маршрутизатором, сокетное соединение работает, поэтому я озадачен.

Как подключить удаленный TCP-клиент к AVD?

...