簡體   English   中英

如何建立TCP連接並將數據發送到Android虛擬設備應用

[英]How to make TCP connection and send data to Android Virtual Device App

我正在Android模擬器上創建和測試簡單的TCP服務器。

我使用一個簡單的Java客戶端程序嘗試連接到在模擬器上運行的服務器。 我嘗試發送一個簡單的字符串,例如“ hello world”。

我認為客戶端和服務器之間的連接已成功初始化; 但是,數據不會路由到Android設備。

服務器線程在clientSentence = inFromClient.readLine();clientSentence = inFromClient.readLine(); 並且客戶端線程在String serverResponse = inFromServer.readLine();

我已經根據具有ADB Google 文檔將本地主機端口6100端口轉發到了AVD虛擬端口7100

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

因為客戶端已寫入數據,但是服務器從未收到過數據,並且客戶端正在掛起,等待服務器的響應。

謝謝可怕的袋熊。 在字符串末尾添加“ \\ n”會導致成功向服務器發送TCP消息。 通過在具有ADB的AVD虛擬路由器上配置端口轉發,確實可以在Android仿真器上設置TCP服務器。 但是,我只在本地主機上對此進行了測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM