Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过DatagramSocket发送列表?_Java_List_Sockets_Client - Fatal编程技术网

Java 通过DatagramSocket发送列表?

Java 通过DatagramSocket发送列表?,java,list,sockets,client,Java,List,Sockets,Client,我有一个Java电子表格应用程序,它提供的一个特性(我开发的)是工作表共享。基本上,任何人都可以是客户端或服务器,因为应用程序既有服务器代码,也有客户端代码。作为服务器的用户创建共享,指定IP,然后创建并激活共享(最佳情况下),服务器在其IP和选定端口上侦听客户端 对于自动发现,我通过UDP广播使用DatagramSockets,而“真正的通信”是基于TCP的(在客户端已经连接之后)。然而,我正试图通过UDP套接字发送一个列表,但我不知道怎么做。该列表包含服务器上的活动共享,我需要将其发送到客户

我有一个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
修饰符添加到不希望包含在序列化对象中的字段:)