一个CS系统中,服务器端有时需要与客户端通信,有时客户端之间有时也需要通信,已知它们都是在互联网上的,服务器端的IP地址是动态的(根据需要也可能改为静态),而客户端中,一些如果我们家中使用的机器是通过宽带网连接到互联网的,也有些如同我们工作中用到机器是一个局域网中通过路由器连接到互联网的。请问用什么技术手段能保证信息的通顺传递?我感觉UDP、TCP、JMS等都有些问题,不知QQ和MSN等是怎么做的,请大家指点,谢谢。  

解决方案 »

  1.   

    这个问题确实比较难,JavaMail也许能有所帮助。
      

  2.   

    只要你服务器ip是公网的ip,就可以被你客户端访问,无论你客户端是在内网还是外网。
    至于如何保证,用java的socket类以及程序的逻辑(需要考虑多种情况,其实也就是信息的同步传输以及网络断了,服务器/客户端程序退出了,该如何处理)。
      

  3.   

    都应该通过服务器转发的。
    A 和 B都是客户,C是服务器
    如果A和B要通信,必定要A->C->B这样
      

  4.   

    上线了都是要reg的。服务端保存一个reg列表,可以的话本地reg后也从服务器load保存一个。然后p2p
      

  5.   


    A和B连接到公网的C没问题,而C反过来连接到A,C是否可行?
      

  6.   

    连接后,自然服务器会获得客户机地址,然后根据ip转发。reg楼上的意思应该是指注册的意思,举个例子,QQ,QQ号码在登陆到服务器后,肯定会有一个号码与ip的对应关系,A用户连接到服务器后,请求和B通话,那么服务器会找B的QQ号码对应的ip然后转发信息。
      

  7.   

    我现在比较困惑的就在这里,如果A找B,先是A找服务器,服务器上有B的ip地址,也有A要发送给B的信息,这样如果要转发成功的话我个人的理解B必须在某端口监听,而且B还得在公网,如果B在内网则收不到转发过来的信息,除非B主动去取。请问我的理解对不对?
      

  8.   


    服务器客户机是可以确定,但是现在比较困惑的是AB两个客户端如果要通讯直接进行当然是不行的,只能通过服务器C中转,A找到服务器C并传输信息当然没问题,C好像只能等B来拿,而主动将A的消息转发给B好像不可行。不知QQ等是怎么做的?
      

  9.   

    我找到了http://topic.csdn.net/t/20021012/13/1090361.html中MobileCn(Auster)的回复(77楼),大家看看是否能解决问题:在第三台IP固定的处在公网中的机器的帮助下实现了两台内网中的机器通信。如下:  
      设内网中的机器a,b。公网中的机器C,c的IP是固定的。A要和B联系:  
      1.a,b先和C建立TCP连接,采用C/S结构,C端作服务器端,a,b为客户端;  
      2.A向C发送一个UDP包,C在接收这个包的时候,可以同时获得A的代理的IP-a和这个包采用的Port-a;  
      3.C将获得的IP和PORT通过TCP连接发送给b;  
      4.B接收到从C发送过来的IP-a和PORT-a,B发送一个UDP包(目标地址和端口号采用刚才收到的IP和PORT)。  
      5.这样A就可以收到一个来自B的UDP包,同时也会获得与B的代理的IP-b和PORT-b。根据这个,a,b之间就可以通过UDP来实现通信。  
       
      注意;在a,b间互相后的IP和Port后,在一定时间(如2分钟)内应该通信一次,以免IP和PORT丢失。