日期:2014-05-18  浏览次数:20648 次

前后台交互的逻辑处理问题请教
客户端(c语言实现)发送请求,等待服务端处理业务逻辑后返回数据,此时一直保持连接(超过60秒未应答则客户端判断业务超时)
客户端与服务端通信通过socket实现
问题是:客户端的请求到服务端后,服务端需要转到推送消息给手机端,手机端收到通知确认后再调用服务器端的请求进行通知(这里手机端和服务端是http请求进行交互),这里的问题是之前的客户端跟服务端的交互流程被打断了?手机通知服务端后怎么回到之前的流程,谢谢

不知道我描述的是否有点乱,欢迎大家回复
------解决方案--------------------
用mina框架吧  会有个session保持连接,

客户端发送请求----->server  这时候会有个session1,相当于一个连接。

server------>手机端    :做推送时候必须是手机和server有连接,相当于手机登陆该server,这时候也会有个session2连接,手机端接到通知,发回确认信息(以请求的方式发过去)。用session1发给客户端。

不过这种交互都不是对应的 ,消息定义要规范,消息类型,每次请求要有唯一ID,这样才能保证请求和响应正确性。
------解决方案--------------------
引用:
60秒时间够,只是手机跟服务器端的交互走另外的流程,独立于当前的客户端跟服务器端的连接
手机端发过来确认后,我怎么走之前的客户端跟服务端后面的流程

这有啥不好做的,那边手机和服务器通信结束了,修改一个公用的状态值,这边跑个循环判断这个状态值是否变了,变了就继续往下走
------解决方案--------------------
设计挺诡异的,居然卡住链接不释放。

客户端跟服务器的通讯中,服务器端可以设置sleep(),然后用一个中央管理模块管理服务器端线程。

当服务器接收到手机通知后,就调用中央管理模块给服务器端线程设置标志位,然后interrupt它;那么服务器的通讯线程就会苏醒,然后检查标志位看看是收到结果(成功)还是没有收到(超时失败)。
------解决方案--------------------
引用:
public void messageReceived(){
1.解析客户端数据
2.push消息到手机端
3.得到手机的确认消息,处理业务逻辑
4.拼装数据给客户端
}


两种建议:
◎ 彻底解耦掉,也就是push消息给到手机端就算结束了;由专门负责取得手机确认消息的线程来拼装发送数据给客户端。
◎ 在push后,等待某信号量;然后由取得手机确认消息的线程来唤醒。