游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3415|回复: 3

[原创][笔记]关于编程中网络通信部分的实现_第二版

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2006-4-13 14:22:00 | 显示全部楼层 |阅读模式
关于编程中网络通信部分的实现_第二版



如图“关于编程中网络通信部分的实现_第二版.png”,应用子系统生成一个针对某个或某些目标的Message,此时子系统并不考虑这个消息是否需要通过网络传输,只是交给MessageRouter去转发,对于不需要通过网络传输的Message,MessageRouter就在本地传递给目标对象,如果需要通过网络传输,那么就将Message序列化为NetworkMessage,也就是将Message对象序列化为一段连续的二进制数据,并且封装为NetworkMessage,然后通过Network发送出去。
对于从Network接收到的数据,Network对其分界后,将其重建为NetworkMessage,然后交给MessageRouter,MessageRouter再将NetworkMessage还原为Message,然后将此Message转发给目标。无论是本地的Message,还是从网络上接收到的Message,其实都只是Message类的某个派生类的实例,目标接收之后的响应,可以通过调用Message类中定义的接口exec()来完成,也就是说消息的响应代码是包含在Message类的派生类之中的。这样接收消息之后,可以通过统一的接口来完成对消息的响应。当然对于从网络上接收到的消息,出于安全性的考虑,可能需要先交由某个对象对其进行检查确认甚至修正后,才能真正去调用其exec()接口进行响应。
Network接收到的数据,将会转换为确定的NetworkMessage类的实例。而NetworkMessage类的实例并不一定会还原成Message类的实例,而可能需要还原成Message类的某个派生类的实例,而这个Message类的派生类可能是从DynamicClassLibrary(即DCL,动态类库)中载入的。因此在NetworkMessage中需要包含这个具体派生类的标识信息,根据这个标识才能知道这个NetworkMessage应该还原为具体哪个类的实例。
类的标识可以有两种方案:
第一种方案,以类名为标识,也就是说在NetworkMessage中需要包含这个Message的派生类的类名字符串,接收方根据这个类名字符串可以从DCL里找到对应的具体的类,并建立相应的实例。这种方案好处是容易实现,坏处是性能不佳。
第二种方案,以定长的二进制数据为标识,比如一个整数。这样做相对于第一种方案的好处是:传输的网络负荷降低了,因为类名字符串所占的空间一般都会大于一个整数所占的4个字节;解析类的标识时,由于此处是定长数据,所以可以获得比解析字符串更高的性能。其缺点是,通信双方需要对类的标识数据建立共识,或者说需要有相同的一张ClassName - ClassID的对照表,而这张表的同步和协商会增加实现的复杂度,甚至可能会降低灵活性。

[em2]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2006-4-13 17:33:00 | 显示全部楼层

Re:[原创][笔记]关于编程中网络通信部分的实现_第二版

我顶……  T.T

6

主题

110

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2006-5-11 09:48:00 | 显示全部楼层

Re:[原创][笔记]关于编程中网络通信部分的实现_第二版

学习了

8

主题

130

帖子

156

积分

注册会员

Rank: 2

积分
156
发表于 2006-5-17 14:45:00 | 显示全部楼层

Re:[原创][笔记]关于编程中网络通信部分的实现_第二版

有人这么做,是可行的。不过,就是都需要通过windows消息路由了—— 也就是把网络处理和消息路由bind了。当然,做为一个框架是一种比较成熟的方案。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 12:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表