2012-06-13 54 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