请求处理模块

负责处理客户端的请求并做出响应。

逻辑说起来很简单,就是接收来自客户端的请求,解包根据请求内容进行计算,然后将数据打包加密后再作为响应发送给客户端,但真要展开来讲里面的细节还是很多讲究的,请容我一点一点展开来讲:

  1. 首先,为了保证服务器与客户端交流的稳定,必须要有一套健壮的通讯协议。因为客户端是基于移动端的,考虑到移动端网络会经常切换,不稳定的特点,应该采用UDP。由于UDP的不可靠性所以要有一套检查&重发机制,然后为了安全还要对数据加密等等。这里就不展开讲了,详细请看附录的通讯协议

  2. 然后,收到客户端的请求后,要怎么处理?最笨的方式接受到请求后直接判断计算然后返回客户端要的数据,然后再去接受下一个客户端的请求。这样做用户少还好办,同时使用服务器的客户端如果太多的话势必会造成大量客户端排队等待服务器响应,给用户很不好的体验。

    本项目采用的是请求接收线程+工作线程池的方式:一个线程负责循环接收客户端请求数据,收到数据后不立刻处理,而是先将客户端IP、端口、接收到的数据封装成对象放进数据队列中,然后由工作线程去解析数据,进行必要计算后发送回给客户端。

  3. 有了重发机制,就要考虑到这样一种情况:客户端发送请求给服务器,服务器进行计算后,并返回响应给客户端。然而由于网络问题客户端并没有收到服务器的响应,于是将数据包重发。如果是这种情况,服务器要怎么处理呢?

    显然,死板地重新计算一遍是很愚蠢的,不仅仅是资源浪费的问题,像是增删改这样的操作,重新执行还会导致不想要的结果。

    为了解决这个问题,必须要有个缓存机制:工作线程计算完的结果,在响应发送池发送完毕后,不应该马上销毁,而应该暂存起来。然后接收请求的线程在接收数据时,会检查短期内是否收到过完全相同的数据包,如果是,则不进行任何计算,将上次的计算结果直接返回给客户端。

接下来我会逐步分解上面提到的关键点,逐个展示核心代码以及逻辑解析。

results matching ""

    No results matching ""