2010-05-01 71 views
0

我們假設我想在兩個使用TCP套接字的java程序之間發送很多消息。在java中通過tcp/ip進行通信的數據結構是什麼?

我認爲最convienient方法是發送對象,如:

PrintStream ps = new PrintStream(s.getOutputStream()); 

ObjectOutputStream oos = new ObjectOutputStream(ps); 

    some_kind_of_object_here; 

    oos.writeObject(some_kind_of_object_here); 

ps.print(oos); 

我想送,字符串,數字,包含HashMap,布爾值 我如何能做到這一點可以存儲所有這些使用FX 1個對象那些屬性? 我雖然關於序列化的ArrayList,我們可以放在那裏一切,但不是優雅的方式。 我想發送不同類型的數據,因爲用戶可以從服務器可以爲其執行的各種選項中進行選擇。 有何建議?

+0

我的建議:試試看看它是如何工作的! – 2010-05-01 12:33:12

+0

我想 和問題是,我不知道如何閱讀對象(我的新類) 我可以將它轉換爲一些相同的類,但如此失敗 – questioner 2010-05-01 13:27:17

回答

1

主人,你知道你可以在一個插座發送任何序列化的對象到另一個JVM,是嗎?

如果是這樣,最簡單的方法是有一個包含所有對象的可序列化的對象,然後轉發它。對象列表可能是最簡單的。然後可以在另一端反序列化它,並以任何您需要的方式處理列表中的對象。

我建議你閱讀Java中的序列化技術,這樣你就可以知道所有你可以做的聰明事情。

http://java.sun.com/javase/7/docs/technotes/guides/serialization/index.html

+0

這是很好的鏈接,我已經找到了有趣的東西 – questioner 2010-05-01 14:02:31

2

您是否考慮過使用RMI?

否則堅持Serializable甚至Externalizable,如果你需要額外的表現。

你不需要象列表這樣的包裝類。當然你可以建立你自己的包裝器對象,這些對象包含所有相關的數據。這種「應用程序數據單元」將幫助您處理髮送實體的正確順序。只要所有成員都是Serializable,一旦將包裝器對象放入對象流中,完整的對象圖將自動序列化。

如果你不使用包裝類,只要確保你想要傳遞的每個對象/類型至少實現Serializable。然後,您必須驗證數據發送的順序是否與除您要到達的數據之外的順序相符。

+0

是的UUID是不一樣的,我想用這1個大對象來存儲所有信息,但我不知道如何讀它的另一面, 我可以使類具有相同的字段,但UUID(或某事像那個)將不會匹配 – questioner 2010-05-01 13:19:21

+0

Java那樣所有的東西對你喜歡這裏:除了在在使用了哈希表像的http://www.java2s.com/Code/Java/Network-Protocol/ServeentireobjectsusingObjectOutputStream.htm,使用任意的類,它必須在類路徑中存在兩個節點。 – 2010-05-01 13:20:54

+0

還是我誤讀了?你的問題是你創建對象的副本?然後使用RMI並導出您的對象。 – 2010-05-01 13:23:04

0

如果您需要保持數據包小,您可以使用普通的Object[],放置任何你想要的內容,並使用指定數據包類型的枚舉,允許你在消息內部存儲多少和哪些類型的對象。

class Message 
{ 
    Type t; 
    Object[] params; 
} 
當然

你將不得不根據Type t選擇如何處理每一個數據包時做切換,但由於協議通常是有限狀態機(這取決於你在編碼的),這將很好地工作,而不會浪費太多空間或者在不需要時分配列表。

+0

如果你想那樣做,使用序列化[]代替。但是我在這裏看不到這一點。只需使用常規課程並將我們的值添加爲成員即可。使用這個數組/列表只會增加一個開銷,當你需要在解編時將這些類型轉換回原來的類型。 – 2010-05-01 11:36:39

+0

是,序列化是確定的(但它只是一種約束,它並不真正意味着什麼)!在任何情況下,你可以不喜歡晴建議,如果你沒有很多種不同PARAMS /類型則params的不同包。 – Jack 2010-05-01 11:42:00

+0

當然是有區別的。如果你把一個不可序列化的對象放入數組中,它在編譯時會失敗。在你的版本中,它在編組期間會失敗 - 這是不好的。 – 2010-05-01 11:46:10

1

你寫代碼的方式,你已經可以發送任何 Java對象。這些對象當然包括「字符串,數字,HashMaps,布爾值」。

剛剛寫入ByteArrayOutputStream:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.write(javaObject); 
oos.close(); 
socket.write(baos.toByteArray()) 
+0

無需ByteArrayOutputStream,ObjectOutputStream自動處理所有這些東西。 – 2010-05-01 12:28:59

+0

我知道如何發送這種類型的對象,但我想發送所有這些字符串,數字,HashMaps,1個對象中的布爾值,只使用: oos.write(This_1_big_powerfull_object); – questioner 2010-05-01 13:16:28

相關問題