2012-06-03 26 views
2

所以我試圖通過一個開放套接字連接發送一個String[]。目前,我有這樣的代碼:通過Socket連接發送一個String []數組

發送:

public void sendData() { 
    try { 
     OutputStream socketStream = socket.getOutputStream(); 
     ObjectOutputStream objectOutput = new ObjectOutputStream(socketStream); 
     objectOutput.writeObject(new String[] {"Test", "Test2", "Test3"}); 

     objectOutput.close(); 
     socketStream.close(); 

    } catch (Exception e) { 
     System.out.println(e.toString()); 
    } 
} 

Recieving:

public Object readData() { 
    try { 
    InputStream socketStream = socket.getInputStream(); 
    ObjectInputStream objectInput = new ObjectInputStream(new GZIPInputStream(socketStream)); 
    Object a = objectInput.readObject(); 
     return a; 
    } catch(Exception e) { 
     return null; 
    } 
} 

我收到了String[]另一端後,我希望能夠像我將通過它遍歷通常這樣做,我可以得到的價值。我當前的代碼似乎不起作用,因爲它返回值爲null

這可能嗎?

+0

這似乎是瞭解Serialization API的絕佳機會,因爲這是它旨在解決的問題。 –

+2

@RobertMassaioli - 他已經在使用序列化API。他真正的問題是他的代碼正在壓縮異常。 –

+0

這裏沒有'陣列/列表'。你正在發送一個'String'數組。 – EJP

回答

8

我的當前代碼似乎不起作用,因爲它返回null作爲值。

這很明顯,爲什麼呢!

} catch(Exception e) { 
    return null; 
} 

,說:「如果出現錯誤,返回null不要告訴我的問題是什麼」!

捕捉和擠壓這樣的例外是壞習慣。至少,你應該嘗試打印一個異常棧跟蹤。在作家代碼中,你這樣做:

System.out.println(e.toString()); 

這比沒有好,但它只是打印異常名稱和消息。你真正應該打印完整的堆棧跟蹤......這樣的:

e.printStackTrace(System.out); 

而對於生產質量的代碼,你應該是在登錄異常,不只是寫一條消息到標準輸出。

一旦你有堆棧跟蹤,你可以找出真正的問題是什麼並解決它。現在

public String[][] readData() { 
    try { 
    InputStream is = socket.getInputStream(); 
    ObjectInputStream ois = new ObjectInputStream(is); 
    return (String[][])ois.readObject(); 
    } catch(Exception e) { 
     return null; 
    } 
} 

就像一個魅力:

-2

我設法弄清楚我自己,我改變了我的recieving代碼這一點。謝謝大家!

+4

但是,你仍然有可怕的在那裏壓縮代碼。你有沒有打算閱讀我的答案? (國際海事組織 - 這個答案*值得*被低估,因爲它是一個不好的編碼習慣的例子。) –

+1

我不是這種風格的粉絲。首先,如果'readObject()'失敗,你完全掩蓋了你得到的特定異常。接下來,如果'readData()'失敗,那麼你不會返回任何有意義的東西 - 提高某種表示失敗的異常並且給你一個從方法外部恢復的條件會更好一些。 – Makoto

+0

另外,我注意到你顯然發送一個String [],並試圖將它轉換爲接收端的String [] []'。這將會嚴重結束...... –