高性能图像处理服务器的实现(五)服务器的逻辑编写

      在我之前的博客高性能图像处理服务器的实现(三)reactors in threads服务器模式中代码流程详解中说到了reactors模式的好处,就是可以轻松的将业务逻辑抽象出来,完全不会影响代码的整体框架,整个图像处理服务器封装在server中的ImageServer类中(server中的echo类是个简单的echo服务器,用来测试服务器的功能是否正常以及测试高并发状态下是否能正常连接),整个代码的业务逻辑只需写在ImageServer中的onMessage()中,onMessage是注册在TcpConnection中的回调函数,每当有消息到达,就会调用onMessage来处理消息。

      消息处理也有一些问题,因为是采用的非阻塞IO,于是可能存在收发的半包问题(数据未完全发送出去或完全接收到),解决这个问题的方法是在net中实现了一个NetBuffer类,这个类用来将数据先缓存下来,然后根据业务逻辑去读取数据,这里要先详细介绍下:

      每次收数据的时候不是用的read()和recv()函数,而是用的readv(),这个函数的作用是当一次收到的数据量太大时分散读到几个缓存buffer中去,这里准备了两个buffer,一个为小一点的buffer,每次读数据基本都会将数据读进小buffer,当一次收到数据太大时,就会把多的数据读到大buffer中,当小的buffer有位置时再读到小的buffer中去,这样基本保证数据的有序性,也不会因为数据量太大没法一次读完,也不会因为为了保证数据量全部读完,准备太多的buffer,浪费空间。

      NetBuffer类中有一个writeIndex和readIndex,通过这两个index来控制读写的位置,NetBuffer中实际存储的数据是用std::string来进行存储的,从NetBuffer中读取数据主要通过retrieveAsString()等系列retrieve函数来进行的。

      然后在ImageServer中有一个std::string Buffer,这个buffer用来接住从NetBuffer中的数据,只有数据相应的数据段真正的处理掉才会将NetBuffer中的数据段retrieve掉,不然只是拷贝方式的读出来,这样可以防止半包情况,比如,client发送了一个Logging消息,但是比如发送方的发送buffer满了或者接受方读取阻塞了,ImageServer中的Buffer只读到一个Lo,这时把它retrieve掉了,后续的消息也就直接作废了。

       ImageServer中把Netbuffer中的消息读出来之后,通过各种handle函数进行处理,这里说下消息格式,我的服务器设计消息格式为以特殊字符*开始再以*结束,提取中间的消息为操作,如提取到Logging操作,则调用handleLogging()函数,然后做相应的业务处理。服务器端发送数据通过其持有的TcpConnectionPtr的sendInLoop()函数,将send任务queue到eventLoop的一次循环末去处理。

       ImageServer中实现功能主要是处理登录,注册,以及上传,下载,还有图像处理任务,因此会持有一个MysqlDB类,登录注册以及上传下载都是通过MysqlDB根据用户名信息usr_name去进行寻找相应信息,其中注册功能主要是向数据库中写入用户的用户名和密码,然后为其分配一个相应的文件夹,将其记录到usr_location中,然后去相应的位置为其新建一个文件夹,用来存储该用户的所有文件,登录功能就不说了,就是根据用户的usr_name匹配其数据库中的usr_password,然后和登录密码比较,上传和下载以及图像处理功能就是指定传输文件,然后进入usr_location文件夹中去操作指定文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值