2011-09-17 10 views
5

Mam kilka pytań dotyczących komunikacji Socket w systemie Android.Android - Server Socket

1) Mam opracowane gniazdo serwera aplikacji dla Androida, który nasłuchuje na porcie 8888.

a) Kiedy gospodarzem mojego serwera na emulatorze nie jestem w stanie komunikować się z nim za pośrednictwem aplikacji klienckich, które mam na PC, ponieważ zarówno aplikacja (Emulator & Klient) są na moim laptopie & w tej samej sieci, myślę, że powinny być w stanie komunikować się ze sobą.

b) Kiedy wdrażam tę samą aplikację serwera na moim urządzeniu mobilnym z Androidem i próbuję komunikować się za pomocą tej samej aplikacji klienckiej, którą mam na moim komputerze, aplikacja kliencka podaje wyjątek limitu czasu, ponieważ nie może się z nią komunikować.

Moje pierwsze pytanie to: Jak mogę przetestować aplikację gniazda serwera/klienta Emulatorem & 1 urządzenie z Androidem? Czy mogę nawet użyć aplikacji do obsługi klienta mojego komputera, aby przetestować gniazdo serwera?

** Mam aplikację gniazda klienta dla mojej drugiej aplikacji, więc nie ma problemu z aplikacją kliencką.

2) Moje drugie pytanie to przetestować moją aplikację na serwerze na urządzeniu z Androidem, czy muszę przesłać żądany port? a) Dla emulatora: Jak mogę przesłać port? b) Dla urządzenia: Jak mogę przesłać port? c) Czy mogę programowo przekazywać port?

** Tylko dla informacji:

Używam Eclipse jako android narzędzie developerski.

** Mój kod serwera, ponieważ może być również problem z moim kodem gniazda serwera.

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

Zmieniano: Bardzo interesujące jest to, że jeśli ustawić port 8080 Client Gniazdo App PC należy podłączać do Android App w urządzeniu z systemem Android, ale nie otrzymują gniazdo na moim serwerze, ani danych Wysyłam. Nic się nie dzieje po linku =>socket = serverssocketocket.accept();

Również ustawiłem zezwolenie w manifeście.


Odpowiedz

6

Na pierwsze pytanie, w jaki sposób uzyskać dostęp do sieci z emulatora: emulator działa na własnej przestrzeni adresowej sieci, odizolowane od komputera. Musisz skonfigurować przekierowanie sieci, aby uzyskać dostęp do urządzeń w sieci.

Zobacz więcej szczegółów w https://developer.android.com/studio/run/emulator-networking.html

+0

OK, które sprawdziło się dla mnie. Pozostało tylko pytanie, jak mogę uruchomić ten sam serwer na moim urządzeniu z Androidem? – KhanZeeshan

+0

Nie jestem pewien, czy podążyłem za pytaniem. Czy masz na myśli scenariusz 1b powyżej?Jeśli tak, powinien działać dobrze, zakładając, że komputer próbuje się połączyć przez port wystawiony na działanie sieci (ten skonfigurowany do przesyłania dalej). – chr

+0

Tak, tylko pytanie pozostawione bez odpowiedzi dotyczy urządzenia z Androidem. Kiedy przekazuję port emulatora, może on komunikować się z urządzeniem Socket komputera, ale wiem, jak sprawić, aby aplikacja kliencka komputera komunikowała się z aplikacją systemu Android wdrożoną na urządzeniu z Androidem. – KhanZeeshan

9

masz ustawić odpowiednią zgodę wewnątrz manifest.xml?

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

jest needet do gniazd instalacyjnych

+0

tak, mam. Przepraszam, zapomniałem o tym wspomnieć. – KhanZeeshan