如何建立TCP连接并将数据发送到Android虚拟设备应用程序

问题描述 投票:1回答:1

我正在Android模拟器上创建和测试一个简单的TCP服务器。

我使用一个简单的Java客户端程序尝试连接到模拟器上运行的服务器。我尝试发送一个简单的字符串,如“hello world”。

我认为客户端和服务器之间的连接已成功初始化;但是,数据不会路由到Android设备。

服务器线程在clientSentence = inFromClient.readLine();行阻塞,客户端线程在String serverResponse = inFromServer.readLine();阻塞。

我有端口转发本地主机端口6100到AVD虚拟端口7100根据谷歌docsADB

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();

因为客户端已写入数据,但服务器从未收到过,客户端正在等待服务器的响应。

java android tcp avd
1个回答
0
投票

谢谢Scary Wombat。在String的末尾添加“\ n”会导致向服务器发送成功的TCP消息。通过使用ADB在AVD虚拟路由器上配置端口转发,确实可以在Android模拟器上设置TCP服务器。但是,我只在本地主机上进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.