我正在做一个网络编程作业,关于编写一个简单的 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?

有帮助吗?

解决方案

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

  1. 创建一个对象(类),其中包含 4 个字段(from/to/enum/message)
  2. 把这个连载一下它必须实施 可串行化. 。有关如何序列化的信息,请参阅此处的其他解决方案
  3. 转换为字节数组并发送到套接字(有关详细信息,请参阅其他地方)

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

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

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

其他提示

您可以使用这样的事情发送任何序列化对象。

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);

您根本它们传递给所述网络接口之前,附加它们。沿着线的东西:

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top