项目小结及难点复盘

项目小结及难点复盘

1、程序总体框架结构
计算程序属于客户端,与服务端建立socket连接并实时获取需要计算的数据。
计算程序结果写入oracle数据库对应的表中,供前台界面读取并显示结果。

2、计算模块所处的位置及功能
完成数据socket通信、数据接收、数据解析、计算、结果写数据库操作。

3、使用技术
socket通信、线程同步、OTL、Oracle数据库查询、STL。

3、遇到的技术难点
1)Socket通信简单协议实现
实现中很像当年的中兴捧月的比赛题目,三次握手、保活连接&通信。
最终选择socket recv循环阻塞接收,数据通过结构体实现,定义好包头head和body,
包头中包含body的个数。

2)包解析
这个也是2年前参加工作遇到的问题。即:积累了包一定大小后再解析。
究竟积累了多大再去解析呢?
实现中发现:如果设定值4K或者8K,会很容易出现解析错位导致错或者串一个字节都会导致程序崩溃。
自己实现循环监视Buffer,解析多少就去掉多少,记录新起点值和剩余Buffer大小。
后面改成通过先进先出双端队列进行管理,即:
入队:来一个包就入队;
解析:积累10个包就解析(根据包大小自己设定的值),避免出现字节剩余现象。
一旦偏移或者出错,解析到的数据就会异常或者越界。
出队:解析完一个包就出队。
实现方式:deque push_back、pop、empty、size函数。

3)多线程同步
进程即主线程负责对解析完后的数据进行计算,并将结果通过OTL写入Oracle数据库中。
子线程负责从Socket接收数据并进行解析。
主线程和子线程存在同步关系,通过Event实现。
子线程接收完、解析完毕后主线程才能执行计算、写入操作。先接受解析、再计算写数据库。
同时主进程写入完毕后通知子线程继续解析。

4)vector清理操作
由于程序循环执行,每次结果都push_back vector中,由于没有进行入口处的初始化操作,导致
程序越往后执行的循环次数越多。直至报错。

2014-6-2 am5:07 思于北京酒店床上

作者:铭毅天下
转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/46322759
如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭毅天下

和你一起,死磕Elastic!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值