1

我正在做一个关于编写一个简单的 IM 系统的网络编程任务(很像最简单的 Windows Messenger 版本)。

规范规定我必须在单个数据报包中发送超过 4 个数据字段,它们是:

To From Type Message
where type refers to message type, implemented as a user defined enum class.

我想学习如何将所有这些数据打包到一个数据包中。

更新:到目前为止的帮助,但是说我有字符串句子和字符串,从正常的方式单独修补数据包将是

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

但是我怎样才能将“from”字符串与句子字符串一起附加到 sendData?

4

4 回答 4

3

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

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);
于 2009-04-18T08:46:24.913 回答
2

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

  1. 创建一个对象(类),其中包含您的 4 个字段(从/到/枚举/消息)
  2. 序列化这个。它必须实现Serializable。有关如何序列化的信息,请参见此处的其他解决方案
  3. 转换为字节数组并向下发送套接字(有关详细信息,请参见其他地方)

在另一端,您将读取此字节流,反序列化并将其转换为上面 1. 中定义的类的实例。

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

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

于 2009-04-18T09:22:08.197 回答
1

您只需在将它们传递到网络接口之前附加它们。类似于以下内容:

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

如果它们不是所有字符串,则需要将它们编码为这样。

于 2009-04-18T07:47:12.590 回答
0

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

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

于 2009-04-18T07:49:46.127 回答