用mina框架吧  会有个session保持连接,客户端发送请求----->server  这时候会有个session1,相当于一个连接。server------>手机端    :做推送时候必须是手机和server有连接,相当于手机登陆该server,这时候也会有个session2连接,手机端接到通知,发回确认信息(以请求的方式发过去)。用session1发给客户端。不过这种交互都不是对应的 ,消息定义要规范,消息类型,每次请求要有唯一ID,这样才能保证请求和响应正确性。

解决方案 »

  1.   

    手机端可以通过socket请求服务器的,
      

  2.   

    设计挺诡异的,居然卡住链接不释放。客户端跟服务器的通讯中,服务器端可以设置sleep(),然后用一个中央管理模块管理服务器端线程。当服务器接收到手机通知后,就调用中央管理模块给服务器端线程设置标志位,然后interrupt它;那么服务器的通讯线程就会苏醒,然后检查标志位看看是收到结果(成功)还是没有收到(超时失败)。
      

  3.   

    这有啥不好做的,那边手机和服务器通信结束了,修改一个公用的状态值,这边跑个循环判断这个状态值是否变了,变了就继续往下走
    =========================
    目前socket通信用的是mina框架,其中服务端的处理大概如下:public void messageReceived(){
    1.解析客户端数据
    2.push消息到手机端
    3.得到手机的确认消息,处理业务逻辑
    4.拼装数据给客户端
    }
    2,3两步,因为第二部发送消息给手机端后,不会立即从那边获取到反馈,需要手机端确认后,再请求服务端,就是这块不太清楚怎么处理,麻烦指点一下,目前我想到的就是在上面的流程中第3步跑一个循环流程,但效率应该不高
      

  4.   


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

  5.   


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

    =============
    建议1,push消息到手机端就结束,后面发送数据给客户端的流程就不走了,后面拿到手机确认消息后,再发送数据给客户端,mina在没有客户端请求的情况下,主动发数据给客户端,此时是不是服务端变成客户端,客户端变成服务端,才能请求
    谢谢建议,我考虑一下
      

  6.   

    建议线程池来做,手机/服务器是一类线程 ,客户端/服务器是另一类 ,用一个包含客户端ID的标量作为线程间通信的key。很容易,范例代码铺天盖地我就不给你贴了,baidu即可。