当前位置: 技术问答>java相关
高手何在,请问如何箱qq一样在局域网内也可以建立udp的服务端进行listen而且网外的用户也可以访问到!满分送上!!!!
来源: 互联网 发布时间:2015-02-24
本文导语: | 这个问题我现在也遇到了,不过更复杂,是JMF的RTP数据如何通过NAT的问题。 你的问题其实是网外用户的数据报的目标地址是什么的问题?是吧?因为局网用户出去后经NAT映射后,端口与地址都不再是局网你打开的地址和...
|
这个问题我现在也遇到了,不过更复杂,是JMF的RTP数据如何通过NAT的问题。
你的问题其实是网外用户的数据报的目标地址是什么的问题?是吧?因为局网用户出去后经NAT映射后,端口与地址都不再是局网你打开的地址和端口了。
其实UDP包是可以通过NAT的,你从局网发出的包,在外网上收到后可以得到它的源地址(这就是经NAT映射后的地址),你只要发到这个地址上,NAT会把你发过来的包再转成相应的局网址送到这台机器上的。
用多播地址的问题是拨号用户没法支持.
|
QQ 起动的时候,会在本地的 4000 端口进行 UDP Socket Listening,而服务端则在 8000 端口进行监听,如果你有 QQ 查 IP 的软件,你会发现所有拨号上网的用户的 QQ 端口号都为 4000 或 4001(开了两个 QQ,依此类推)。
如果是通过代理上网,则你的 UDP 数据包要经过代理转发,你的包先发到代理服务器,代理服务器再替你将你的数据包发到你的好友的 UDP 监听端口,此时你的朋友看到你的端口号,只是代理的端口号。
如果是通过代理上网,则你的 UDP 数据包要经过代理转发,你的包先发到代理服务器,代理服务器再替你将你的数据包发到你的好友的 UDP 监听端口,此时你的朋友看到你的端口号,只是代理的端口号。
|
可以使用类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。
基本原理如下:
多点广播:
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。