我正在开发一个与游戏服务器连接的小客户端。服务器通过HTTP向连接的客户端发送消息。它相对容易解析进入客户端的文本消息并形成回复的响应。
现在我想弄清楚的是如何打破这个过程。我希望有一个线程接收消息,将它们解析为一些数据对象,并将它们放入一个“传入”队列进行处理。然后另一个线程从该队列中读取消息并处理它们(客户端的大脑或AI)并将响应发送回服务器。
我想让监视传入数据的线程处理文本(分解消息,拉出重要数据等),这样AI线程就没有那个开销。但问题是服务器可以向客户端发送几百种不同类型的消息(客户端可以看到的消息,其他玩家,如果你正在解雇等)。我想将这些数据打包成一个整洁的小结构,以便AI可以快速处理它,并且可以轻松地重写AI。
但是如何编写一个可以从队列中提取内容并知道它是什么类型的消息的函数(所以我知道消息中包含哪些数据)?
示例消息:
ALIVE (告诉你,如果你还活着)
它只有一个数据对象,即当前游戏时间
DAM (告诉你是否受损)
有一大堆数据,谁损坏你,多少,它是什么枪,你能看到它们等等。
可以创建一个可以处理所有这些不同消息类型并由单个函数解释的对象吗?很少有消息具有共同的属性,所以我不认为继承或只是制作一个非常大的消息类会非常好......
我不是在寻找一个完整的解决方案,只是指出我正确的方向,希望我能够在路上学到一点: - )
答案 0 :(得分:3)
基本上你要问的是一个协议:如何交换和解释数据。传统上你会定义自己的(并且他们倾向于开始相当天真的可能性 - 发送带有换行符的纯文本数据以指示命令的结束,或类似的东西)。过了一段时间,你开始意识到还需要更多(你如何处理二进制数据?你如何处理错误?等等)
幸运的是,有些图书馆可以让您的生活更轻松。这些天我倾向于支持简单的RPC类库来满足我的大部分需求。示例包括协议缓冲区(由Google提供),Apache Thrift(由Facebook提供)和Apache Avro。