Java 在一个UDP数据报中发送多个数据

Java 在一个UDP数据报中发送多个数据,java,udp,packets,Java,Udp,Packets,我正在做一个网络编程作业,关于编写一个简单的IM系统(非常像最简单的windows messenger版本) 规范规定我必须在一个数据报包中发送4个以上的数据字段,这些字段是: To From Type Message where type refers to message type, implemented as a user defined enum class. 我想学习如何将所有这些数据打包成一个数据包 更新:thx获得目前为止的帮助, 但是假设我有一个字符串句子和来自 通常单独修补

我正在做一个网络编程作业,关于编写一个简单的IM系统(非常像最简单的windows messenger版本)

规范规定我必须在一个数据报包中发送4个以上的数据字段,这些字段是:

To From Type Message
where type refers to message type, implemented as a user defined enum class.
我想学习如何将所有这些数据打包成一个数据包

更新:thx获得目前为止的帮助, 但是假设我有一个字符串句子和来自 通常单独修补数据包的方法是

byte[] sendData = new byte [256]
sendData = sentence.getBytes();

但是,如何才能将“from”字符串与句子字符串一起附加到sendData?

您只需在将它们传递到网络接口之前附加它们即可。大致如下:

byte[] buff = new byte[256];
// Add al your fields here to buff.
DatagramPacket packet = new DatagramPacket(buff, buff.length, address, 1234);
socket.send(packet);

如果它们不是全部字符串,则需要对它们进行编码。

在将它们传递到网络接口之前,只需将它们追加即可。大致如下:

byte[] buff = new byte[256];
// Add al your fields here to buff.
DatagramPacket packet = new DatagramPacket(buff, buff.length, address, 1234);
socket.send(packet);

如果它们不是全部字符串,则需要对它们进行编码。

编码数据有很多选项,所有这些选项都可以归结为将四个字段放入一个数据结构中,然后一次性发送

  • DIY(自己动手…)
  • 爪哇
  • XML
  • 等等

重要的一点是编码需要显示四个字段中的哪一个在数据包中的哪一点,否则远端将无法可靠地对其进行解码。

对数据进行编码有很多选项,所有这些选项都归结为将四个字段放在一个数据结构中,然后一次性发送

  • DIY(自己动手…)
  • 爪哇
  • XML
  • 等等

重要的一点是编码需要显示四个字段中的哪一个位于数据包中的哪一点,否则远端将无法可靠地对其进行解码。

您可以使用类似的方式发送任何可序列化对象

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(buffer);
out.writeObject(objectYouWantToSend);
out.close();
buffer.close();
DatagramPacket packet = new 
    DatagramPacket(buffer.toByteArray(), 
                   buffer.size(), 
                   InetAddress.getByName(...),
                   portNumber);
socket.send(packet);

您可以使用类似这样的方式发送任何可序列化对象

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(buffer);
out.writeObject(objectYouWantToSend);
out.close();
buffer.close();
DatagramPacket packet = new 
    DatagramPacket(buffer.toByteArray(), 
                   buffer.size(), 
                   InetAddress.getByName(...),
                   portNumber);
socket.send(packet);

简而言之,您需要做的是:

  • 创建包含4个字段(from/to/enum/message)的对象(类)
  • 把这个连载。它必须实施。有关如何序列化,请参见此处的其他解决方案
  • 转换为字节数组并向下发送套接字(有关详细信息,请参阅其他地方)
  • 在另一端,您将阅读这个ByTestStream,反序列化并将其转换为在1中定义的类的实例。上面

    通过创建包含4个字段的一个对象并序列化该对象,可以将所有四个字段一起发送(我觉得这是个绊脚石?)


    请注意,数据报的大小将受到网络传输层的限制,但对于此应用程序,我怀疑这不是问题。

    简单地说,您需要做的是:

  • 创建包含4个字段(from/to/enum/message)的对象(类)
  • 把这个连载。它必须实施。有关如何序列化,请参见此处的其他解决方案
  • 转换为字节数组并向下发送套接字(有关详细信息,请参阅其他地方)
  • 在另一端,您将阅读这个ByTestStream,反序列化并将其转换为在1中定义的类的实例。上面

    通过创建包含4个字段的一个对象并序列化该对象,可以将所有四个字段一起发送(我觉得这是个绊脚石?)


    请注意,数据报的大小将受到网络传输层的限制,但对于此应用程序,我怀疑这不是问题。

    虽然这可能很简单,但如果没有分隔符,将单个字段转换回原来的四个字段或固定长度字段可能会很棘手。我认为这将包含在提到的规范中。实际的插入和提取取决于该规范,因此,如果需要更多信息,则需要提供。该注释是在您更改为字节数组之前编写的,当时您只有四个串联字符串。尽管如此,它仍然适用……虽然可能很简单,但如果没有分隔符,将单个字段转换回原来的四个字段或固定长度字段可能会很困难。我认为这将包含在提到的规范中。实际的插入和提取取决于该规范,因此,如果需要更多信息,则需要提供。该注释是在您更改为字节数组之前编写的,当时您只有四个串联字符串。不过,这仍然是正确的……对于初学者的家庭作业,我会使用相当简单的数据结构,如固定长度或简单的分隔符。如果你提出了一个复杂的解决方案,比如XML或序列化,你几乎肯定会被列为潜在的剽窃者/骗子。是的,我确实把DIY放在第一位,不过:)哦,我明白了,起初我只是假设这是一个我还没听说过的新缩写词(到处都是)。现在才意识到这是最受欢迎的DIY:-)Java序列化与“复杂解决方案”完全相反-它内置在语言中,比其他任何解决方案都需要更少的代码。序列化是一种方法:)使解决方案变得非常简单。相信我,他/她不会因为使用序列化而被标记为剽窃者。这是他们希望他在这个级别(如果他/她在做Java网络)已经知道的东西,在这个初学者级别的家庭作业中,我将使用相当简单的数据结构,比如固定长度或简单的分隔符。如果你提出了一个复杂的解决方案,比如XML或序列化,你几乎肯定会被列为潜在的剽窃者/骗子。是的,我确实把DIY放在第一位,不过:)哦,我明白了,起初我只是假设这是一个我还没听说过的新缩写词(到处都是)。现在才意识到它是老的最爱DIY:-)Java序列化与“复杂解决方案”完全相反-它内置在语言中,比其他任何语言都需要更少的代码