项目是C/S架构,因为业务需求需要,服务端在某些时刻需主动向客户端发送数据(只在某些时刻,不频繁交互数据).根据这一需求问题就来了
1.服务端如何主动向客户发送数据,保持长连接吗?这涉及心跳,连接池维护.使用短连接吗??该由谁主动发起连接??如果是服务端会遇到连接不成功的问题(出现的问题后述),如果是客户端主动发起,又该如何实施??用TCP或UDP定时向服务端发送数据询问吗??2.服务端主动连接客户端的问题,会遇到NAT,防火墙问题,我目前只处理NAT的情况,方法是客户端2小时定时向服务端发送小数据(打孔),在发生调用时服务端使用端口复用跟客户端建立通信(只针对非对称的NAT,理论上是可以,不过没测试),如果是防火墙直接拦掉呢??有相当部分的路由器会直接拦掉外网的主动连接请教各位牛牛们,给一些方案或是分析下方案的优缺点.....

解决方案 »

  1.   

    等会!我扔一下筛子!

    好!结果出来了!还是服务端主动连接客户端吧!要不畏NAT,克服防火墙最后达到客户端!
      

  2.   

    这些问题 有点深啊 
    我只知道 穿透NAT 我用的打洞 其他的我不熟悉 呵呵!
    期待接分!
      

  3.   

    说一下针对我的提出问题的想法:仍然采用服务端连接客户端,模拟打洞的逻辑过程,首先由客户端发起初始连接到服务端(定期发送,2小时轮询),客户端此时使用绑定的本地端口并复用该端口,启动监听,服务端的端口同样也复用监听.服务端收到客户端连接后提取公网IP,port保存,待有任务直接连接客户端不知是否可行???
      

  4.   

    UDP? tcp是不行的 连接断了分配的IP端口就没了 NAT还是拦你
    要是UDP可以 但是长时间没有数据包的话 NAT分配的IP端口就没了
    长连呗
      

  5.   

    指SCOKET的端口吗??客户端跟服务端都会使用固定的端口进行绑定本地端口....如果NAT映射的话,TCP会更长
      

  6.   

    客户端定期向服务器发送UDP包,服务器保存接收到的UDP包的IP和端口,服务器要向客户端发送数据时,直接向这个保存的地址中发送数据就行了。我们这样测的能行,谁还有好方法说一下?
      

  7.   

    估计这个方法一旦超过NAT的映射时间就不行了,好像默认是一分钟
    种种原因,暂时不考虑使用UDP方式