2012-06-13 96 views
0

我有一個使用Java的電子表格應用程序,它提供的功能之一(我開發的)是工作表共享。基本上,任何人都可以成爲客戶端或服務器,因爲應用程序同時具有服務器和客戶端代碼。作爲服務器的用戶創建共享,指定IP,然後創建並激活共享(最佳情況),服務器在其IP和選定端口上偵聽客戶端。通過DatagramSocket發送列表?

對於自動發現,我通過UDP廣播使用DatagramSockets,而'真正的通信'是基於TCP(客戶端已連接後)。但是,我試圖通過該UDP套接字發送List,我不知道該怎麼做。該List包含我需要發送到客戶端的服務器上的活動共享,以便它知道它可以連接到什麼。

它是這樣的:

客戶端 - >通過發送一個數據包到網絡上查找活動服務器 - >服務器偵聽和發送數據包回來。這個包應該是List(如果可以通過這些類型的套接字發送)。

任何人都可以闡明我的問題嗎?謝謝。

回答

3

在發送之前,您可以將List轉換爲byte [],並使用Java序列化將其轉換回收件人列表。

// Sender 
    List list = new ArrayList(); 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    ObjectOutputStream outputStream = new ObjectOutputStream(out); 
    outputStream.writeObject(list); 
    outputStream.close(); 

    byte[] listData = out.toByteArray(); 


    // Reciever 
    ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(listData)); 
    list = inputStream.readObject(); 

只要確保您放入列表中的所有對象都實現了Serializable。

+0

謝謝。只是一個問題:我所有的List對象都是'ServerInstance',這是我的'ServerShareInstance'主類中的一個內部類。我應該序列化前者嗎? – swiftcode

+0

如果它是一個內部類,它也需要聲明爲Serializable。如果它擴展了另一個可序列化的類或實現了一個擴展了Serializable的接口,則不需要聲明類Serializable。只要你的對象圖中的所有對象都可以是Serializable的實例,那你就很好。如果您嘗試將這樣的對象寫入ObjectOutputStream,您將會收到一個NotSerializableException異常。您還應該在類中包含一個serialVersionUID字段,這在每個反序列化對象的JVM中都必須相同,因此應將其設置爲特定值。 –

+0

原來我是序列化'套接字'列表,這是不允許的(不實現接口),所以它總是拋出異常。我轉向'InetSocketAddress',因爲我只需要這個IP和端口,現在它工作的很好。謝謝! – swiftcode