2012-09-12 30 views
0

我在使用套接字庫時遇到問題。套接字對象值爲空

import java.io.*; 
import java.net.*; 

public class SocketAdapter{ 

    Socket mySocket=null; 
    PrintWriter out=null; 
    BufferedReader in=null; 


    public SocketAdapter(String host,int port){ 


     try { 
      InetAddress serverAddr = InetAddress.getByName(host); 

      mySocket = new Socket(serverAddr, port); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      out = new PrintWriter(mySocket.getOutputStream(), true); 
     } catch (NullPointerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      in = new BufferedReader(new InputStreamReader(mySocket.getInputStream())); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void writeto(String data){ 
     out.println(data); 
    } 

    public String readdata(){ 

     String fromSocket=null; 
     try { 
      fromSocket = in.readLine(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }// blocking 
     return fromSocket; 

    } 
    public void close(){ 

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

    } 

} 

我通過我的主要活動中的第二個線程訪問此類。在調試器中,mySocket的值始終爲空。我不知道我在做什麼錯,但我很確定它的基本原理。

編輯:原來它的套接字對象爲空,因爲由應用程序沒有互聯網許可觸發的IOException。

在清單中修復它。

+0

任何異常/堆棧跟蹤? – njzk2

回答

0

有沒有在構造函數中捕獲異常的多點。它只是誤導了代碼的其餘部分,假設對象已經完全構建,而沒有。將構造函數更改爲throw這些異常並移除所有try/catch,並在呼叫站點相應地捕獲異常。那麼你再也不能從這段代碼中獲得一個空的套接字引用。

0

使用Socket變量作爲靜態可能會起作用。 static Socket mySocket = null;

或 使用單獨的函數來獲取套接字連接。

public Socket getSocketConnection(String strServerIP , int iPort) 
{ 
    try 
    {    
     Socket s = new Socket(strServerIP,iPort); 
     return s; 
    } 
    catch (Exception e) 
    {   
      return null; 
    } 
    }// End getSocketConnection Method.  
-1

如果您正在使用多個線程,則需要通過承包商進行同步。 您可以自己實現它,或將SocketAdapter類實例定義爲volotile

也請閱讀this

+0

完全不正確。構造函數不需要被同步,並且*不能被聲明爲'synchronized'。它甚至沒有意義。每個線程將構建自己的實例,而不是同一個實例。將'SocketAdapter'變量聲明爲volatile並不能解決這個問題。 -1。 – EJP

+0

@EJP沒有人,你錯了。將構造函數聲明爲synchronized的方式是使用volatile。你應該閱讀我鏈接到的帖子。 –

+0

@Babibyu(1)沒有這樣的事情作爲一個同步的構造函數,並且不需要任何一個。 (2)將volatile聲明爲變量對存儲在其中的對象的構造函數沒有影響。 (3)在本文中沒有跡象表明在任何地方都需要「volatile」。 (4)你的答案仍然不正確。 – EJP