2011-09-17 77 views
5

我有幾個關於Android中的套接字通信的問題。Android - 服務器套接字

1)我已經開發了服務器套接字應用程序的Android偵聽端口8888

一)當我主機上的模擬器我無法通過我的客戶端應用程序進行通信,以它在我的服務器我因爲兩個(模擬器&客戶端)應用程序都在我的筆記本電腦&在同一網絡上,我認爲他們應該能夠相互溝通。

b)當我在我的android移動設備上部署相同的服務器應用程序,並嘗試通過我PC上的相同客戶端應用程序進行通信時,客戶端應用程序因爲無法與其通信而發出超時異常。

我的第一個問題是我如何測試服務器/客戶端套接字應用與仿真器& 1 android設備?我甚至可以使用我的PC的客戶套接字應用程序來測試我的服務器套接字?

**我有我的其他應用程序的客戶端套接字應用程序,所以客戶端應用程序沒有問題。

2)我的第二個問題是測試我的服務器應用程序在Android設備上是否必須轉發所需的端口? a)對於Emulator:我如何轉發端口? b)對於設備:我如何轉發端口? c)我可以通過編程方式轉發端口嗎?

**只爲信息:

我使用Eclipse作爲機器人的研究與開發工具。

**我的服務器代碼也可能與我的服務器套接字代碼有問題。

Socket socket = null; 
      DataInputStream dataInputStream = null; 
      DataOutputStream dataOutputStream = null; 
      ServerSocket serverSocket = null; 
     try 
     { 
      serverSocket = new ServerSocket(SERVERPORT); 
      System.out.println("Listening :" + SERVERPORT); 
      System.out.println("Server IP:" + SERVERIP); 
     } 
     catch (Exception e) 
     {    
      e.printStackTrace(); 
     } 
     while(true) 
     { 
      try 
      { 
       socket = serverSocket.accept(); 
       BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       System.out.println("ip: " + socket.getInetAddress());     
       String str = in.readLine(); 
       System.out.println("message Received: " + str); 
      } 
      catch (Exception e) 
      {     
       e.printStackTrace(); 
      }    
      finally 
      { 
       if(socket!= null) 
       { 
        try 
        { 
         socket.close(); 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
       if(dataInputStream!= null) 
       { 
        try 
        { 
         dataInputStream.close(); 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
       }     
       if(dataOutputStream!= null) 
       { 
        try 
        { 
         dataOutputStream.close(); 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 

編輯: 一個非常有趣的是,如果我設置端口爲8080的PC客戶端的Socket應用都連接到Android應用程序在Android設備上,但我不我的服務器,也不是數據上的接收套接字我發送。鏈接後沒有任何反應=>socket = serversocket.accept();

另外我已經在清單中設置了權限。


回答

6

關於第一個問題,如何從仿真器訪問網絡:在仿真器上自己的網絡地址空間中運行,從您的電腦隔離。您必須配置網絡重定向才能訪問網絡上的設備。

查看更多詳細信息在https://developer.android.com/studio/run/emulator-networking.html

+0

好的,爲我工作,現在只剩下問題是我如何可以在我的Android設備上運行這個相同的服務器? – KhanZeeshan

+0

不知道我跟着這個問題。你的意思是你的情況1b以上?如果是這樣,它應該工作正常,假設PC試圖通過暴露於網絡的端口(配置爲轉發的端口)連接。 – chr

+0

是的,只有問題沒有回答是關於Android設備。當我在仿真器上轉發端口時,它可以與PC的Socket設備通信,但我知道如何使該PC的客戶端應用程序與部署在Android設備上的Android應用程序進行通信。 – KhanZeeshan

9

有你設定的Manifest.xml內正確的權限?

<uses-permission android:name="android.permission.INTERNET" /> 

是needet設置插座

+0

是的,我有。對不起,我忘了提到這一點。 – KhanZeeshan