2014-09-22 33 views
0

我在一個應用程序上工作,我做了一個TCP Listner,它可以在無線網絡上正常工作,但是當我連接到3G/4G或移動網絡時,它不起作用。可以通過一些身體幫助我嗎? 我的代碼是在這裏Android的TCP偵聽器不能在3G/4G上工作?

public class ListenerService extends Service { 

Socket socket; 
private ServerSocket serverSocket; 
BufferedReader in = null; 
static String message=null; 
int portNo=1619; 
boolean flag=true; 
final static String MY_ACTION = "MY_ACTION"; 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    new Task().execute(); 

} 

    private class Task extends AsyncTask <Void, String, String> { 
     @Override 
     protected String doInBackground(Void... params) {  
     try { 
      serverSocket = new ServerSocket(portNo); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     while (flag) { 
      try { 

       socket = serverSocket.accept(); 
       in = new BufferedReader(new InputStreamReader(
         socket.getInputStream())); 
       //try { 
        StringBuilder total = new StringBuilder(); 
        String line; 
        while ((line = in.readLine()) != null) { 
         total.append(line); 
        } 
        message = total.toString(); 
        Log.d("NETWORK-RECEIVE", "Message!:" + message); 



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

     try { 

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

     return message; 
     } 
    } 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 
    Log.d("Server Startd","Listener Serverice is running"); 
    //Toast.makeText(getApplicationContext(),"Service Started", Toast.LENGTH_LONG).show(); 
    return super.onStartCommand(intent, flags, startId); 
} 

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

}

可一些告訴我,我錯過了什麼M在這裏嗎?

回答

2

您正在嘗試兩個設備在連接到兩個不同子網的TCP連接的。這不可能。你幾乎問了這個問題:「當我站在我面前時,我的朋友爲什麼能聽到我,但是如果他在另一個房間裏,我不知道?」做這項工作的唯一方法就是打開大門。但是你必須實現這個稱爲NAT穿越或「穿孔」的「門」,這實際上是一種不同的通信概念(檢查Android P2P (direct-connection) over the Internet (behind NAT)Android: NAT Traversal?)。

最後,有三種解決方案,您的問題:

  1. 實現自己的服務器要連接(非常乏味)的設備之間放。
  2. 使用第三方庫像sip2peer或其他任何你能找到適合你的。
  3. 不要打擾。有時候這不值得麻煩。

編輯:
這聽起來像你有一個網絡服務器,試圖連接到運行上述代碼的Android設備。這將是選項1,但仍然無法通過Internet訪問Android設備。據我所知,你必須扭轉這種情況:設備必須在服務器上註冊,以便服務器能夠「連接」其他設備。

+0

這是不可能的,我會打我的服務器從我的手機連接到不同的網絡的wifi.after服務器將發送數據在我的端口1619. 它工作正常wifi.but當我連接到我的移動網絡,它不工作,我認爲有一個權限或套接字連接的問題。 – 2014-09-22 09:38:20

+2

@MuhammadNadeem什麼「服務器」?一個真正的Web服務器?在這種情況下,這是可能的。但是,如果您的「服務器」是Android設備,那麼這是不可能的,因爲如果沒有Wi-Fi或來自不同的子網,無法訪問它,除非路由和專門配置爲Web服務器。 – 0101100101 2014-09-22 09:44:58

+0

是的,我們有一個webserver.and我正在監聽webserver.when網絡服務器在我的android手機上發送數據,然後我的監聽器監聽端口1619上的數據,它在wifi上工作正常。但如果我連接到3G或4G它不起作用 – 2014-09-22 09:48:11