最近在弄一个聊天软件,是基于C/S端的,其中聊天部分想采用UDP实现,主要在我们学校内部使用,我们学校是个局域网,但是学校的各个园区之间使用了不同的网段,好像这样如果使用UDP的话就不能正常通信,要使用打洞技术了。上网查资料说是首先要把客户级的IP和端口经过转换之后保存在服务器端,然后不同网段的客户端需要通讯从服务器端取到对方经过转换之后的IP和端口,有点搞不清楚那个过程,那个IP地址和端口的转换到底是怎么个弄法?能不能直接登陆到服务器的时候就传送自己的IP和端口保存到数据库,如果是那样的话,也就没有什么转换啊,感觉和UDP直接取到IP和端口没什么两样了。如果要转换的话,用JAVA能够怎样转换哦,还网高手赐教!

解决方案 »

  1.   

    聊天的话,为什么不用TCP呢,UDP是不保证安全的传输协议,建议视频传输之类的使用,呵呵
      

  2.   

    新手,随便说两句不知道不同网段这里指的是什么,如果是不同的子网之间可能有相同IP,比如都有192.168.0.3,只通过IP是无法通信的,可能要用mac地址,不过mac可以随便改,所以好像也不靠谱。我假设不同子网之间IP是唯一的。关键可能在于服务器的配置。各园区是不同的子网,所以服务器应该是multi-home的,在每个子网都有一个IP。
    客户端可以用UDP connect到本子网的服务器地址,服务器创建一个线程为客户端服务,并且把客户端的IP和端口写到数据库里。这个IP和端口记录应该有时间限制,超过时间后服务器会询问客户端是否还在线,如果没有回应就把记录删去。
    有新消息从客户端到服务器后,服务器检查一下目标IP看是否是同一个子网,如果是,直接广播;如果不是,查数据库取出目标IP所在的子网,把消息从服务器的相应接口传出去。用多播实现可能更好,还可以群聊
      

  3.   

    看看JXTA吧 http://jxta.dev.java.net
      

  4.   

    双方都在局域网内就没有办法TCP直连了,所以像QQ等都会尽量使用UDP直连的IP地址转换不需要你处理,网关默认就已经进行了转换。服务器接收到DatagramPacket中getAddress和getPort已经是网关的端口
    UDP打洞的过程大致如此:
    1、双方都通过UDP与服务器通讯后,网关默认就是做了一个外网IP和端口号 与你内网IP与端口号的映射,这个无需设置的,服务器也不需要知道客户的真正内网IP
    2、用户A先通过服务器知道用户B的外网地址与端口 
    3、用户A向用户B的外网地址与端口发送消息, 
    4、在这一次发送中,用户B的网关会拒收这条消息,因为它的映射中并没有这条规则。 
    5、但是用户A的网关就会增加了一条允许规则,允许接收从B发送过来的消息 
    6、服务器要求用户B发送一个消息到用户A的外网IP与端口号 
    7、用户B发送一条消息,这时用户A就可以接收到B的消息,而且网关B也增加了允许规则 
    8、之后,由于网关A与网关B都增加了允许规则,所以A与B都可以向对方的外网IP和端口号发送消息