2012-05-23 89 views
0

我剛剛得到一個快速的問題。 我試圖通過發送TCP包來與應用程序進行通信,然後服務器將TCP包發送回其他設備。 但是我怎麼能做一個服務,當它通知的設備上收到TCP包時?android發送和接收TCP包

我試過了;

extends Service { 
Thread henk; 

private static final String TAG = "Service"; 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 
    henk = new Thread(new Runnable(){ 

     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       Boolean end = false; 
       ServerSocket ss = new ServerSocket(1337); 
       while(!end){ 
         //Server is waiting for client here, if needed 
         Socket s = ss.accept(); 
         BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 

         String st = input.readLine(); 
         Log.d("Tcp Example", "From client: "+st); 

         s.close(); 

       } 
     ss.close(); 


     } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } 
     } 



    }); 


} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 

} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 

    henk.run(); 

} 

但是,這只是崩潰我的應用程序。 請幫忙嗎?

堆棧跟蹤:

E/ActivityManager( 240): ANR in tictactoe.elqauto 
E/ActivityManager( 240): Reason: Executing service tictactoe.elqauto/.servicere 
cieve 
E/ActivityManager( 240): Load: 7.09/7.29/7.5 
E/ActivityManager( 240): CPU usage from 9411ms to 3791ms ago: 
E/ActivityManager( 240): 1.2% 3857/de.devmil.minimaltext: 1.1% user + 0.1% ke 
rnel/faults: 191 minor 
E/ActivityManager( 240): 2.5% 240/system_server: 1.9% user + 0.5% kernel/fa 
ults: 20 minor 
E/ActivityManager( 240): 0.1% 4797/tiwlan_wq: 0% user + 0.1% kernel 
E/ActivityManager( 240): 0% 16322/org.adwfreak.launcher: 0% user + 0% kernel 
/faults: 226 minor 1 major 
E/ActivityManager( 240): 0% 19108/com.aricent.mtp: 0% user + 0% kernel/faul 
ts: 16 minor 
E/ActivityManager( 240): 0% 30600/com.google.process.gapps: 0% user + 0% kern 
el/faults: 20 minor 5 major 
E/ActivityManager( 240): 11% TOTAL: 8% user + 3% kernel + 0.1% iowait 
E/ActivityManager( 240): CPU usage from 368ms to 884ms later: 
E/ActivityManager( 240): 5.6% 240/system_server: 1.8% user + 3.7% kernel/fa 
ults: 15 minor 
E/ActivityManager( 240):  5.6% 266/ActivityManager: 1.8% user + 3.7% kernel 
E/ActivityManager( 240): 44% TOTAL: 1.9% user + 1.9% kernel + 40% iowait 

摘要:

所以我想要做的就是發送一個TCP包一個名稱服務器的服務器將獲得與所屬的IP從數據庫中找到該名稱,並用一些信息發送一個TCP包到它。由於我沒有找到解決方案,我嘗試了套接字,但現在我被卡在接收部分。

+0

我已經這樣做 –

+0

你用過logcat嗎?如果可以的話,當應用程序崩潰時,從logcat發佈堆棧跟蹤:'adb logcat -s *:E'應該在命令行中執行。我的猜測是嘗試從UI線程更新UI,但崩潰輸出肯定會告訴你。 – jarvisteve

+0

@jarvisteve寫棧跟蹤到'/data/anr/traces.txt'但我找不到那個文件? –

回答

1

在android設備上運行TCP服務器沒什麼意義,因爲您通常不知道它的地址。

另一種解決方案是保持客戶端連接與服務器保持連接,然後將軟件包推回到應該接收軟件包的設備。

更高效的解決方案是使用Google的C2DM。但是,這需要使用Google帳戶登錄設備。

+0

嗯,我發送我的IP時,改變到數據庫和服務器獲取我想要發送它與IP的名稱,並將包發送到該設備,但它需要被recvieved C2DM甚至可以做到這一點? –

+0

收件人離線時會發生什麼?如果傳輸失敗,或者當收件人上網時包裹應該最終到達? C2DM旨在解決最後一種情況,但如果延遲是一個問題,也可以用來實現第一種情況。您將不得不更詳細地描述您的溝通方案,以便對此進行更多評論。 – werk

+0

當他回到網上時,他會收到這就是即時通訊也試圖。等待我編輯它 –