Java 通过DatagramSocket发送列表?
我有一个Java电子表格应用程序,它提供的一个特性(我开发的)是工作表共享。基本上,任何人都可以是客户端或服务器,因为应用程序既有服务器代码,也有客户端代码。作为服务器的用户创建共享,指定IP,然后创建并激活共享(最佳情况下),服务器在其IP和选定端口上侦听客户端 对于自动发现,我通过UDP广播使用DatagramSockets,而“真正的通信”是基于TCP的(在客户端已经连接之后)。然而,我正试图通过UDP套接字发送一个Java 通过DatagramSocket发送列表?,java,list,sockets,client,Java,List,Sockets,Client,我有一个Java电子表格应用程序,它提供的一个特性(我开发的)是工作表共享。基本上,任何人都可以是客户端或服务器,因为应用程序既有服务器代码,也有客户端代码。作为服务器的用户创建共享,指定IP,然后创建并激活共享(最佳情况下),服务器在其IP和选定端口上侦听客户端 对于自动发现,我通过UDP广播使用DatagramSockets,而“真正的通信”是基于TCP的(在客户端已经连接之后)。然而,我正试图通过UDP套接字发送一个列表,但我不知道怎么做。该列表包含服务器上的活动共享,我需要将其发送到客户
列表
,但我不知道怎么做。该列表
包含服务器上的活动共享,我需要将其发送到客户端,以便它知道可以连接到什么
事情是这样的:
客户端->通过向网络发送数据包来查找活动服务器->服务器侦听并发回数据包。此数据包应该是列表
(如果可以通过此类套接字发送)
有人能解释一下我的问题吗?谢谢。您可以在发送前将列表转换为字节[],然后使用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();
只需确保列表中的所有对象都实现可序列化。您可以在发送前将列表转换为字节[],然后使用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();
只需确保列表中的所有对象都可序列化。谢谢。只是一个问题:我的所有列表对象都是
ServerInstance
,这是我的ServerShareInstance
主类中的一个内部类。我应该只序列化前者吗?如果它是一个内部类,那么它也需要声明为可序列化的。如果它扩展了另一个可序列化的类,或者实现了一个扩展可序列化的接口,则不需要声明该类可序列化。只要对象图中的所有对象都可以是可序列化的实例,就可以了。如果尝试将此类对象写入ObjectOutputStream,将收到NotSerializableException。您还应该在类中包含一个serialVersionUID字段,这在反序列化对象的每个JVM中都必须相同,因此您应该将其设置为一个特殊值。事实证明,我是在序列化Socket
列表,这是不允许的(不实现接口),所以它总是抛出该异常。我转向了InetSocketAddress
,因为我只需要那个IP和端口,现在它工作得很好。谢谢伟大的PS:您可以将transient
修饰符添加到您不想包含在序列化对象中的字段:)谢谢。只是一个问题:我的所有列表对象都是ServerInstance
,这是我的ServerShareInstance
主类中的一个内部类。我应该只序列化前者吗?如果它是一个内部类,那么它也需要声明为可序列化的。如果它扩展了另一个可序列化的类,或者实现了一个扩展可序列化的接口,则不需要声明该类可序列化。只要对象图中的所有对象都可以是可序列化的实例,就可以了。如果尝试将此类对象写入ObjectOutputStream,将收到NotSerializableException。您还应该在类中包含一个serialVersionUID字段,这在反序列化对象的每个JVM中都必须相同,因此您应该将其设置为一个特殊值。事实证明,我是在序列化Socket
列表,这是不允许的(不实现接口),所以它总是抛出该异常。我转向了InetSocketAddress
,因为我只需要那个IP和端口,现在它工作得很好。谢谢伟大的PS:您可以将transient
修饰符添加到不希望包含在序列化对象中的字段:)