Как установить TCP-соединение и отправить данные в Android Virtual Device App

1

Я создаю и тестирую простой TCP-сервер на эмуляторе Android.

Я использую простую клиентскую программу Java, чтобы попытаться подключиться к серверу, работающему на эмуляторе. Я пытаюсь отправить простую строку типа "Привет, мир".

Я думаю, что соединение между клиентом и сервером успешно инициализировано; однако данные не направляются на устройство Android.

Серверный поток блокируется в строке clientSentence = inFromClient.readLine(); и клиентский поток блокируется в String serverResponse = inFromServer.readLine(); ,

У меня есть перенаправленный порт локального хоста 6100 в виртуальный порт AVD 7100 согласно документам Google с ADB

adb -s emulator-5554 forward tcp:6100 tcp:7100

Вот класс Java TCPTestClient

public class TCPTestClient
{
   public static void main(String argv[]) throws Exception
   {
      String sentenceToServer = "hello server";
      System.out.println("initializing socket");
      Socket clientSocket = new Socket("127.0.0.1", 6100);
      System.out.println("socket initialized");
      System.out.println("getting output stream to server");
      DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
      System.out.println("found output stream to server");
      System.out.println("getting input stream from server");
      BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
      System.out.println("found input stream from server");
      System.out.println("writing sentence to server");
      outToServer.writeBytes(sentenceToServer );
      System.out.println("sentence written");
      System.out.println("waiting for sentence response from server");
      String serverResponse = inFromServer.readLine();
      System.out.println("serverResponse = "+serverResponse);
      System.out.println("socket closed");
      clientSocket.close();
   }
}

Вот метод Android-приложения initTcpTestServer()

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

     String clientSentence;
     ServerSocket welcomeSocket = new ServerSocket(7100);

     while ( true )
     {
        Log.d("TAG", "looking for socket");
        Socket connectionSocket = welcomeSocket.accept();
        Log.d("TAG", "socket accepted");
        Log.d("TAG", "getting input stream");
        BufferedReader inFromClient = new BufferedReader(
              new InputStreamReader(connectionSocket.getInputStream()));
        Log.d("TAG", "input stream found");
        Log.d("TAG", "getting output stream");
        DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
        Log.d("TAG", "output stream found");
        Log.d("TAG", "reading input stream");
        clientSentence = inFromClient.readLine();
        Log.d("TAG", "input stream read");
        Log.d("TAG", "input = " + clientSentence);
        Log.d("TAG", "writing output back to client");
        outToClient.writeBytes(clientSentence);
        Log.d("TAG", "output written back to client");
     }
  }
  catch ( IOException e )
  {
     e.printStackTrace();
  }
}

Если я сначала инициализирую сервер TCP, я получаю вывод

initTcpTestServer()
looking for socket

После инициализации TCP-сервера, а затем инициализации TCP-клиента, я получаю с сервера

getting input stream
input stream found
getting output stream
output stream found
reading input stream

и от клиента

initializing socket
socket initialized
getting output stream to server
found output stream to server
getting input stream from server
found input stream from server
writing sentence to server
sentence written
waiting for sentence response from server

так что похоже, что сокет установлен, но сервер блокируется в строке

clientSentence = inFromClient.readLine();

и клиент блокирует в

String serverResponse = inFromServer.readLine();

потому что клиент записал данные, но сервер так и не получил их, и клиент зависает в ожидании ответа сервера.

Теги:
tcp
avd

1 ответ

0

Спасибо, Страшный Вомбат. Добавление "\n" в конце строки привело к успешному TCP-сообщению на сервер. Сервер TCP действительно можно настроить на эмуляторе Android, настроив переадресацию портов на виртуальном маршрутизаторе AVD с помощью ADB. Тем не менее, я только тестирую это на локальном хосте.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню