-1

作为我们期末项目的一部分,我们需要实现一个分布式聊天系统。该系统需要具有可扩展性和鲁棒性。牢记这些标准,我对如何通过套接字发送矢量对象感到困惑。

由于向量是动态分配的,因此发送它的对象将不起作用,因为它指向的内存没有被复制。为了完成这个序列化将是最好的选择。但是,根据我们项目的要求,我们不应该使用任何第三方库,例如 Boost 和 Google Protocol Buffers。

因此,要序列化矢量对象并通过网络发送它,我似乎找不到解释如何继续的入门指南。还有其他我们可以使用的替代方法吗?

该向量将包含聊天组中每个成员的字符串(IP 地址:端口)。

任何帮助都会很棒。谢谢你。

注意:我们需要让聊天客户端在集群上运行,我相信为了使系统健壮和可扩展,我们还需要考虑字节序。

4

1 回答 1

0

如果你想在这种情况下进行二进制序列化,你需要实现 2 种类型的序列化——整数和字符串。整数可以很容易地逐字节写入,通过将其转换为 char 然后移位:

// assuming 32 bit ints and 8 bit bytes
int integer = 1337;
unsigned char data[4];
for(int i = 0; i < 4; ++i)
    data[i] = (unsigned char) (integer >> 8*i);

通过 sum 和 shift 反序列化:

int integer = 0;
for(int i = 3; i >= 0; ++i)
{
    integer += data[i];
    integer <<= 8;
}

(我没有测试代码,所以在调试器中跟踪它并确保它做我认为它做的事情:))

序列化的字符串将是序列化的大小,然后是流上的字符。

然后向量将是这两个的组合——向量的大小,然后是一个接一个的字符串。

您可能想要添加魔术词和校验和,以确保客户端知道会发生什么以及如何验证数据。如果您想变得真正花哨,请为 ASN.1 或其他东西实现您自己的支持。:)

于 2012-04-08T19:55:29.527 回答