个p2p协议的网络程序,服务器是公网IP,就是可以直接通过ip访问,有2个客户端,都是内网ip,都只可以访问服务器端,我想在2个客户端之间直接通信要怎么办?我现在只知道客户端访问服务器以后,过NAT网络地址转换后的地址和端口,这个可以从服务器那里读出来,也就是服务器知道内网客户端的虚拟公网地址和端口.
比如:
server: serversocket ss = new serversocket("202.103.96.15",5000);
clinet1: socket cs = new socket("202.103.96.15",5000);这样client1连接服务器以后,服务器ss.accept()就得到了一个socket,从这里可以知道client1的虚拟公网地址,假设是202.158.48.50:58462,那假设有个client2怎么去访问client1呢?总不能在client1也创建一个serversocket("202.158.48.50",58462),然后client2 new socket("202.158.48.50",58462),这样肯定不行,不知道大家有什么好的办法和意见.怎么可以直接实现内网client之间直接通信.
希望大家写详细点,谢谢!
比如:
server: serversocket ss = new serversocket("202.103.96.15",5000);
clinet1: socket cs = new socket("202.103.96.15",5000);这样client1连接服务器以后,服务器ss.accept()就得到了一个socket,从这里可以知道client1的虚拟公网地址,假设是202.158.48.50:58462,那假设有个client2怎么去访问client1呢?总不能在client1也创建一个serversocket("202.158.48.50",58462),然后client2 new socket("202.158.48.50",58462),这样肯定不行,不知道大家有什么好的办法和意见.怎么可以直接实现内网client之间直接通信.
希望大家写详细点,谢谢!
http://www.tomore.com/1/14659.html
不过我还是不明白打洞是什么意思
此时,Client A与Client B都可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息Client B就能收到了呢?答案是不行,因为如果这样发送信息,NAT B会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的外网地址)的洞,那么Client A发送到187.34.1.56:40000的信息,Client B就能收到了。这个打洞命令由谁来发呢,呵呵,当然是Server S。
ClientA和ClientB都是与服务器建立连接,如果要向对方发送信息,就把消息交给服务器(消息内包含了对方的IP地址),让服务器把消息广播出来,再由ClientA和ClientB分别对收到的广播消息进行过滤,如果消息的目的地址是本机IP就收下。
那就不算p2p了啊,传输数据要经过服务器中转,那就加重了服务器负担
JXTA有纯java版的,而且还不错,
理论上可以用手机在外面联系在家中的局域网的电脑