netutil是一个简单的Go语言TCP/IP网络编程工具库。
其中的代码和设计思路来源于真有趣团队的《仙侠道》项目。
netutil的目标是为基于消息包的TCP/IP网络应用提供一个稳定高效的通讯层。
基于消息包的TCP/IP网络应用是生活中最常见的一种TCP/IP应用类型,例如:聊天系统、网络游戏等。
但是TCP/IP是面向流的协议,所以基于包的TCP/IP网络应用,通常都有一套自己的消息包分割算法,用于从TCP/IP网络流中分割出一个个独立的消息包。
最常用的算法是在每个消息包的头部安插固定字节数的包长度信息,例如mysql的通讯协议就是这么做的。
netutil用的也是同样的算法,netutil中提供了类似Erlang的{pack: N}的分包协议设置,调用者只需要设置用几个字节存储消息长度,netutil就会按设置进行接收和发送消息包。
netutil还内置了一套经过优化的网关代码,这套网关有以下特性:
- 支持分布式部署的多对多结构,一个网关前端可以连接到多个网关后端,一个网关后端可以被多个网关前端连接
- 转发消息时不需要重复申请内存和复制数据
- 经过优化的广播机制,一个广播只需要在网关之间通讯一次,减少系统调用的同时也降低带宽消耗
网络层作为网络应用的底层,其稳定性是网络应用的重要指标,所以netutil做了比较充分的单元测试来提早发现自身的问题。
我们将这些代码和算法从项目中提取出来的目的,除了方便自己方便大家,也希望在将来netutil能成为一个好用的,并且经过比较多项目验证的,可以让人放心使用的网络编程库。 所以希望大家在使用过程中如果有遇到问题,及早反馈,便于我们改进,同时也欢迎大家贡献代码和想法。
我们团队的邮箱是:realint[at]qq.com
netutil中的协议解析部分,为了追求效率,使用了指针操作进行强制类型转换,其原理是先假定进行通讯的两端的CPU使用的都是同样的大小端格式,比如都是小端格式或者都是大端格式。
就目前的实践经验来判断,以及从同行前辈那道听途说,似乎目前已经很难在生产环境和应用环境找到大端格式的设备。
所以这里做了一个比较大胆的假设,假设netutil只部署于小端格式的设备上。
目前已测试可用的部署环境有:Windows、Linux、MaxOS系统 + x86或i686架构CPU的环境。
配套的客户端通讯代码,请注意使用小端格式,例如ActionScript3中的字节流和套接字默认都是是大端格式,需要手工设置成小端格式。
如果您的应用是部署于特殊环境,请谨慎使用netutil。
如果您有把握证明大端格式的设备也很常见,请告诉我们,我们会考虑是否牺牲效率换取通用性。
最近项目比较赶,没空写教程,请大家暂时先通过tcp_test.go文件中的代码揣摩用法。目前wiki是开放编辑的,欢迎大家贡献教程文档和示例,谢谢。