2010-05-04 48 views
4

我面臨一個線程和套接字的問題我無法弄清楚,如果有人可以幫助我請我真的很感激。android中的套接字,線程和服務,如何讓它們一起工作?

有事實

我有一個服務類網絡服務,這個類中我有一個Socket屬性。 我希望它處於服務整個生命週期的連接狀態。

要連接套接字我在一個線程中執行它,所以如果服務器必須超時,它不會阻塞我的UI線程。

問題是,進入線程,我連接我的套接字一切都很好,它是連接的,我可以跟我的服務器,一旦這個線程結束,我嘗試在另一個線程中重用套接字,我有錯誤消息Socket is not connected

問題是: - 套接字是否在線程結束時自動斷開? - 他們無論如何我們可以傳回一個來自被調用線程的值給調用者?

非常感謝,

這裏是我的代碼

public class NetworkService extends Service { 

     private Socket mSocket = new Socket(); 


    private void _connectSocket(String addr, int port) { 
     Runnable connect = new connectSocket(this.mSocket, addr, port); 
     new Thread(connect).start(); 

    } 

    private void _authentification() { 
     Runnable auth = new authentification(); 
     new Thread(auth).start(); 
    } 


    private INetwork.Stub mBinder = new INetwork.Stub() { 

     @Override 
     public int doConnect(String addr, int port) throws RemoteException { 
      _connectSocket(addr, port); 
      _authentification(); 
      return 0; 
     } 
    }; 


class connectSocket implements Runnable { 
     String addrSocket; 
     int portSocket; 
     int TIMEOUT=5000; 

     public connectSocket(String addr, int port) { 
      addrSocket = addr; 
      portSocket = port; 
     } 

     @Override 
     public void run() { 

      SocketAddress socketAddress = new InetSocketAddress(addrSocket, portSocket); 
      try { 
       mSocket.connect(socketAddress, TIMEOUT); 
       PrintWriter out = new PrintWriter(mSocket.getOutputStream(), true); 
       out.println("test42"); 
          Log.i("connectSocket()", "Connection Succesful"); 
      } catch (IOException e) { 
       Log.e("connectSocket()", e.getMessage()); 
       e.printStackTrace(); 
      }  
     } 
    } 

    class authentification implements Runnable { 

     private String constructFirstConnectQuery() { 
      String query = "toto"; 
      return query; 
     } 

     @Override 
     public void run() { 
      BufferedReader in; 
      PrintWriter out; 
      String  line = ""; 

      try { 

       in = new BufferedReader(new InputStreamReader(mSocket.getInputStream())); 
       out = new PrintWriter(mSocket.getOutputStream(), true); 
       out.println(constructFirstConnectQuery()); 


       while (mSocket.isConnected()) { 
        line = in.readLine(); 
        Log.e("LINE", "[Current]- " + line); 
       } 
      } 
      catch (IOException e) {e.printStackTrace();} 

     } 
    } 
+0

你有沒有想過這個?我有同樣的問題。 – Gourneau 2013-09-18 23:20:15

回答

2

定義輸出流作爲一個成員變量,在你的線程附加它,只是關閉流時,即可大功告成...

當前您正在打開(並隱式關閉)線程內的輸出流。當線程死亡時,它將關閉該輸出流,這反過來可能會損壞套接字/連接。

如果您在線程之外定義流,則可以將其附加到線程中,並在稍後關閉它,例如在服務被要求終止時。