可以使用类MulticastSocket,每个客户端在一个广播地址的特定端口上监听UDP报文,而且在客户端启动的时候也向该地址进行广播,这样别人能知道你的存在,而你也可以知道别人的存在,还不需要服务器,而且信息总是最新的,再设置每隔一段时间重新广播 基本原理如下: 
多点广播: 
int broadcastPort=5678; 
int ttl=10; 
String broadcastAddress="239.80.80.80"; 
InetAddress multiAddr=InetAddress.getByName(broadcastAddress); 
byte[] bbuf=new byte[1024]; 
DatagramPacket multiDatagram=new DatagramPacket(bbuf,bbuf.length,multiAddr,broadcastPort); 
MulticastSocket broadcastSocket=new MulticastSocket(); 
multiSocket.send(multiDatagram,ttl); 广播监听: 
MulticastSocket receiveSocket=new MulticastSocket(broadcastPort); 
receiveSocket.joinGroup(multiAddr); 
receiveSocket.receive(multiDatagram); 
说明:broadcastPort>1024就可以,ttl是广播包允许经过的路由器的个数,越大则越可以被更多的客户端监听到,但是给网络带来太大负担。broadcastAddress理论的取值范围为244.0.0.0到239.255.255.255,但是有些保留地址224.0.0.0到244.0.0.255。 
其它细节可以参考书籍或者API。 

解决方案 »

  1.   

    如果这样的话,A B C三类地址都要保证可以收到信息的话那不等于是向全球发送信息了吗,那样太可怕了吧!
      

  2.   

    程序中有一个变量ttl控制路由器转发的次数,路由器每转发一次就将ttl的值减一,如果该值减为0,将不再转发,如果只在局域网里面广播,就可以将ttl的值设置为1。
    如果有人想恶意的破坏网络的性能,那有很多办法啊!
      

  3.   

    QQ 起动的时候,会在本地的 4000 端口进行 UDP Socket Listening,而服务端则在 8000 端口进行监听,如果你有 QQ 查 IP 的软件,你会发现所有拨号上网的用户的 QQ 端口号都为 4000 或 4001(开了两个 QQ,依此类推)。
    如果是通过代理上网,则你的 UDP 数据包要经过代理转发,你的包先发到代理服务器,代理服务器再替你将你的数据包发到你的好友的 UDP 监听端口,此时你的朋友看到你的端口号,只是代理的端口号。
      

  4.   

    to ahtu(阿土)
    不会存在你那样的情况的,所有的路由器都有过滤此种消息的功能,我想你的广播消息恐怕走不到五步
      

  5.   

    那个broadcastAddress根据什么来进行设置呀??如果我只要在局域网广播呢!?
      

  6.   


    这个问题我现在也遇到了,不过更复杂,是JMF的RTP数据如何通过NAT的问题。你的问题其实是网外用户的数据报的目标地址是什么的问题?是吧?因为局网用户出去后经NAT映射后,端口与地址都不再是局网你打开的地址和端口了。其实UDP包是可以通过NAT的,你从局网发出的包,在外网上收到后可以得到它的源地址(这就是经NAT映射后的地址),你只要发到这个地址上,NAT会把你发过来的包再转成相应的局网址送到这台机器上的。
    用多播地址的问题是拨号用户没法支持.
      

  7.   


    所以,要做的事就是在局网机器上建立一个DatagramSocket先send一个报出去,在外网的Server上得到并保存它的地址(真实地址,从UDP报中取出的),然后局网这台机器用这个DatagramSocket来receive,监听UDP数据。其他的事就不用管了。我正在调试中,有问题欢迎讨论。
      

  8.   

    多谢大家帮忙,我还在研究中,欢迎讨论,我的email是[email protected]
      

  9.   

    to sharetop(天生不笨)send和receive的是同一个DatagramSocket吗DatagramSocket进行listen的时候可以进行send吗我用网络监视的东西看到如果我用不同的线程也就是DatagramSocket来进行send的时候DatagramSocket的是自动增加的,到底要怎么做呢
      

  10.   

    to sharetop(天生不笨)send和receive的是同一个DatagramSocket吗DatagramSocket进行listen的时候可以进行send吗我用网络监视的东西看到如果我用不同的线程也就是DatagramSocket来进行send的时候DatagramSocket的端口是不断自动增加的
      

  11.   


    对,send和receive是同一个DatagramSocket,否则在NAT上肯定是不同的。listen在一个线程中进行,不断地receive对方发来的报,send是与之不冲突的。你如果用不同的DatagramSocket来做,对方(外网上的机器)只知道你曾经send过他的一个信息的这个DatagramSocket,对于其它的socket他根本不知道。因为不同的端口,是吧?你想要如何呢?我对你最后一句不是太明白?
      

  12.   

    sharetop(天生不笨) 非常感谢,我已经有点明白了,现在马上就要进行测试了,我估计没问题的了:)
      

  13.   

    sharetop(天生不笨) 最后请问,要是有多个数据要发送,是否可以建立多个线程同时用同一个DatagramSocket来进行发送呢!
      

  14.   


    应可以的,但是我是用一个线程一个Socket来发的,多个目标地址循环send,也许这样不好,我试一下多线程来发送,不过目标不多,实在不好看出结果。
      

  15.   

    sharetop(天生不笨) 可否跟我联系,大家交个朋友好吗[email protected]
      

  16.   

    sharetop(天生不笨)可否跟我联系,大家交个朋友好吗[email protected]
      

  17.   


    欢迎一起讨论 [email protected]