2011-10-26 83 views
1

我的android程序無法正常工作。我正在使用普通的客戶端服務器套接字。我用telnet測試過我的服務器,它工作正常,但是當我用我的android程序嘗試時,它不起作用(更多細節在第二個)。這裏是我的代碼:IOException並未提供足夠的信息

Socket s = null; 
try 
{ 
    String SocketServerAddress = db.getPhSsServerAddress(); 
    Integer SocketServerPort = db.getPhSsServerPort(); 
    s = new Socket(SocketServerAddress, SocketServerPort); 
    Log.d(MY_DEBUG_TAG, "Setting up Socket: " + SocketServerAddress + ":" + SocketServerPort); 
    DataOutputStream out = new DataOutputStream(s.getOutputStream()); 
    DataInputStream in = new DataInputStream(s.getInputStream()); 
    Log.d(MY_DEBUG_TAG, "Connected to: " + s.getInetAddress() + " on port " + s.getPort()); 

    out.writeUTF("Helo, Server"); 
    out.flush(); 
    Log.d(MY_DEBUG_TAG, "Bytes written: " + out.size()); 
    String st = in.readUTF(); 

    Log.d(MY_DEBUG_TAG, "SocketServerResponse: " + st); 
} 
catch (UnknownHostException e) 
{ 
    Log.e(MY_ERROR_TAG, "UnknownHostException: " + e.getMessage() + "; " + e.getCause()); 
    } 
catch (IOException e) 
    { 
    Log.e(MY_ERROR_TAG, "IOException: " + e.getMessage() + "; " + e.getCause() + "; " + e.getLocalizedMessage()); 
    } 
finally 
{ 
    try { 
      s.close(); 
     } catch (IOException e) { 
     Log.e(MY_ERROR_TAG, "IOException on socket.close(): " + e.getMessage() + "; " + e.getCause()); 
     } 
} 

我曾經來到這裏是拋出IOException,使用任何消息或造成連接。導致錯誤的特定行是String st = in.readUTF()。如果我註釋掉那一行,我的代碼運行正常(沒有拋出異常),但是我的服務器不承認有任何數據已經發送給它。當然,由於該行已被註釋掉,所以我沒有收到任何數據。

那麼,我怎樣才能找出問題所在?今晚我會試着看看wireshark傳遞的信息是否能提供任何見解。

+0

您應該考慮在所有'Log.e()'方法的末尾添加異常。他們可以做'e(「tag」,「msg」)或'e(「tag」,「msg」,throwable)''。如果你記錄完整的可丟棄數據,你可能會得到更多的信息。 – Gray

回答

1

是使用readUTF()writeUTF()過服務器? writeUTF()以只能被readUTF(),理解的唯一格式寫入數據,這些數據不會理解其他任何內容。

編輯EOFException意味着沒有更多的數據。您應分別抓住它,並通過關閉套接字等,當然也可以假引起處理它通過readUTF()試圖讀取並沒有與writeUTF().

寫入的數據,並決定它是一個IOException當它是一個真正的EOFException手段你沒有打印出或記錄異常本身,只是它的消息。請始終使用爲例外提供的日誌方法,或者至少使用Exception.toString().

+0

OMG,就是這樣。哇,我整天都在排除故障。感謝提示。 – MrGibbage

+0

我看到你的編輯並有更多問題。以前,我有「因爲這就是我在日誌中看到的:「IOException:null,null,null」。空值是因爲getMessage,getCause和getLocalizedMessage全部返回null ???我在網上發現了這個代碼,沒想到看看有沒有其他例外,我可以捕捉到,你能給我一個好的日誌方法的例子來打印出有用的信息,因爲你是建議嗎? – MrGibbage

+0

@MrGibbage你已經有幾個建議。不知道你是如何得到你的輸出的,但它不能通過調用我曾經使用過的任何異常特定的日誌方法。 – EJP

-1

我記得我有一天有一個問題,DataInpuStream ...嘗試這樣做:

in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 
+0

可悲的是,Kerai沒有幫助。 @格雷,謝謝你的提示。我以前從來沒有見過。我記錄了Log.e(MY_ERROR_TAG,「IOException:」+ e.getMessage()+「;」+ e.getCause()+「;」+ e.getLocalizedMessage(),e);在eclipse中,我看到了我的日誌語句後的完整錯誤。它看起來像這是一個java.io.EOFException。我不確定我將如何解決這個問題。 :( – MrGibbage

+0

這將解決性能問題,沒有別的。 – EJP

相關問題