2010-05-29 136 views
0

我正在用Java編寫一個程序,其中兩臺或多臺使用UDP的機器之間進行通信。我的應用程序在通過網絡將它們序列化到另一臺機器之後發送對象,在這臺機器上它將被反序列化並處理它。到目前爲止,我成功地發送了一種物體。使用java通過UDP發送/接收不同的對象

我的問題是我希望發件人能夠發送不同類型的對象,並使接收者能夠接收它們並將它們再次轉換爲適當的類型。但是,由於UDP分配了字節緩衝區,因此將數據接收到緩衝區中,因爲不同的對象具有不同的大小,所以不可能投射或檢測接收到的對象的類型。

是否有一種方法可以用來使用UDP發送不同類型的對象,然後在另一端接收它們? (我不要求代碼在這裏,只是一些想法)

感謝

編輯: 我要找發送/接收不同類型的對象不知道是什麼的類型的最佳方式下一個預期對象。假設我有三種對象類型,我希望在任何時候都能收到它們中的任何一種。 布賴恩的評論之後,我又想到了另一件事:如何爲可變大小的數據類型(如字符串,數組等)設置緩衝區大小。當接收到一個UDP數據包時,您首先要分配一個大小的緩衝區來接收該對象。這與我原來的問題有某種關係。

+0

發佈一些代碼會很有用。對象的內容大小可能會有所不同,而不是因爲它們的類型。 – 2010-05-29 14:18:41

+0

難道你不使用buildin java序列化?在這種情況下:只需從內容中發送類名稱,以便接收方可以處理它。 – Daniel 2010-05-29 14:48:17

+0

@Brian:是的,但如果我只在對象中使用原始數據類型,那麼這不會是一個真正的問題。 @Daniel:不,我在這裏使用內置的一個。 – AAA 2010-05-29 20:13:48

回答

2

爲什麼不把它們包裝成一個已知類型(Packet),其有效載荷類型爲Object?然後,您可以對您的Packet進行反序列化並詢問其類型的結果負載。

2

你可以序列化(使用ObjectOutputStream),也可以反序列化(使用ObjectInputStream)。然後您檢索一個對象。如果通過UDP,TCP,管道,本地文件或其他方式傳輸它,它不起作用。序列化寫入OutputStream,反序列化從InputStream讀取。

您myObject.getClass()檢測您收到的內容。

+0

對於特定的對象,序列化,發送,接收和反序列化都已成功完成。我正在尋找發送/接收不同對象類型的最佳方式,而不知道下一個預期對象的類型。假設我有三種物體類型,我希望在任何時候都能接收其中的一種物體。 – AAA 2010-05-29 20:20:47

0

基本上,它是反序列化的對象,然後執行instanceof檢查。然而,由於您使用UDP時明確提到的字節緩衝區的問題,我建議看看一個消息庫這已經執行這種字節的緩衝區管理:JGroups

在僞代碼,有工作JGroups的看起來像這樣:

JChannel channel = new JChannel("myapp"); 
Customer c = new Customer("IniTrodeInc.); 
Book b = new Book("Twilight"); 
channel.send(new Message(c)); 
channel.send(new Message(b)); 

而且在接收端

JChannel channel = new JChannel("myapp"); 
channel.addListener(new Listener(){ 
public void onMessage(Message m) { 
    if (m.getObject() instanceof Customer) { 
    handleNewCustomer((Customer)m.getObject())); 
    } else if (m.getObject() instanceof Book) { 
    handleNewBook((Book)m.getObject())); 
    } else { 
    // Ups, we received s.t.h else 
    } 
} 
}); 

JGroups的自動執行消息傳遞信道的抽象概念,Y您不需要知道這是UDP,TCP還是多播等.JGroups也將處理對等通信,例如,將消息發送給還沒有收到消息的對等節點等。