分享开发soket经验 我的基于socket的持久层(转)
2009-11-24 14:30
218 查看
前言
本项目Pixysoft.Framework.Noebe.Sockets,是把数据库的操作用socket暴露出来,实现局域网的调用。不支持穿越防火墙、不支持局域网-公网链接、不支持路由。
作品完成后,能够通过这个框架,把众多异构数据库链接成一个庞大的数据库池(云??)
开发过程
第一阶段 自以为是刚开始,网上搜索了几个socket的局域网聊天的例子,用同步的方法实现的。
链接在这里:http://www.pudn.com/downloads40/sourcecode/p2p/detail138986.html
2天时间我就搞了个prototype,本机调用一点问题都没有。还有点沾沾自喜,以为自己牛逼了,2天搞好了个socket 的服务器。
结果一部署,问题来了。
服务器正在传输数据,但是本地收了10%不到就断了。用thread去等待简直就是放屁,谁知道thread等到什么时候。就算把数据偏移量也传递过去,一样断。
第二阶段 认真对待
一下子受了挫折,开始认真搜索资料。在codeprojects和cnblogs找到了异步socket的例子,特别是NCindy这个非常的好,有个很简单的异步模型例子http://www.cnblogs.com/ncindy/archive/2006/11/01/547143.html
于是新的解决方案:
1. 使用异步做服务器
2. 使用自定义的结束符号,例如 \0\r\n\0\r\n。让socket读到才判断结束。这样不用thread去瞎等了。
3. 这个结束符号有可能分割在2次的数据包中,因此判断的时候要进行最近包合并判断。
用异步又花了2天时间搭建了系统,本机跑起来不用thread等待,更加爽了。以为ok了。再部署,又崩了。
传输到服务器的大数据量(5mb左右吧)没有问题,但是接受的时候,服务器会显示客户端断开链接,而客户端仍然在等待。
第三阶段 自我发展
由于客户端不知道链接断了,于是我想到了用双链接去保证,同时实现了一个续传的机制。就是本地发送一个命令:
RESUME;续传的SOCKETID;偏移量
通知本socket将代替刚才失败的socket,续传。然后用一个心跳链接去检测、一个数据链接去传输。
部署,tnnd,又崩了。当2个链接同时断开的时候,又进入等待。
第四阶段 完成
继续思考,既然有了续传机制,何不自己做一个定时,如果超过这个时间,仍然接受不到数据,自己断开,再续传。
当然,我最讨厌用thread了,直接用异步去做定时。
1. 首先有个统计器,统计传输的频率
2. 异步等待的时间 = 频率*10.
3. 如果异步等待结束,发现刚才的数据仍然没有接收到,自动断开,然后启动续传。
总算完成了!
第五阶段 完成
经过测试,在超级恶劣的环境下(bt/emule/网页/土豆/还有不时断网),能够实现大数据量的稳定传输。
小结
1. socket服务端开发,尽量使用异步,那个感觉超级爽!我看日志,可以在1毫秒内处理多个链接(不是单单接收,而是包括了处理)。这样1秒钟的吞吐量就非常大了。2. 使用自定义的结束符表示传输完毕,例如\r\n这些。当然,不能用\0了。
3. 链接断开,客户端不一定知道,会进入假死状态。因此客户端的链接需要有检视,建议用异步检测,不要用线程。
4. 最后,socket的传输超级不稳定,说断就断,还断的没有先兆。
后续
接下来,打算用comet技术去实现跨越防火墙的数据库实时调用。叫做Pixysoft.Framework.Noebe.Comets
大概思路:
1. 有个网站作为注册中心
2. 服务器启动后链接网站,实现comet
3. 客户端需要访问服务器数据库,就联入comet
如果有研究方向相同的,希望大家相互讨论一下。
相关文章推荐
- 分享开发soket经验 我的基于socket的持久层
- 分享开发soket经验 我的基于socket的持久层 [转]
- 《大掌门》欧阳刘彬--基于COCOS2D-X引擎开发经验分享
- (热更新相关)CocoaChina 2013春季开发者大会:《大掌门》欧阳刘彬--基于Cocos2d-x引擎开发经验分享
- Facebook移动应用开发经验分享:基于用户不忘本心
- 《大掌门》欧阳刘彬--基于Cocos2d-x引擎开发经验分享
- 项目开发经验分享—导入Excel
- 高性能web开发经验分享
- .NET、C#与Silverlight开发圣典——分享15位MVP的最佳实践经验
- 从程序员到技术总监,分享10年开发经验
- 高性能web开发经验分享
- 程序员:Android开发经验分享(一)
- 基于react+react-router+redux+socket.io+koa开发一个聊天室
- web前端开发学习经验分享——css,js入门篇
- web前端开发学习经验分享——css,js进阶篇
- 十八年开发经验分享(07)递归程序设计
- 基于RIA Flex Flash 平台开发的进销存企业信息管理系统开发经验
- Socket开发探秘--基于Json格式的数据协议收发
- 【分享】自学 iOS 开发的一些经验
- 从程序员到技术总监,分享10年开发经验