个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之间直接通信.
希望大家写详细点,谢谢!

解决方案 »

  1.   

    通过服务器中转数据,或者http://www.ppcn.net/n1306c2.aspx看看这个,对你有所帮助的
      

  2.   

    我有完整的由Java编写的即时通信工具代码与文档,可以卖给你文档演示可以在这里找到
    http://www.tomore.com/1/14659.html
      

  3.   

    axing941021(洵) ;谢谢你
    不过我还是不明白打洞是什么意思
      

  4.   

    首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,Client B登录Server S,NAT B给此次Session分配的端口是40000,那么Server S收到的B的地址是187.34.1.56:40000。   
       此时,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。
      

  5.   

    现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的外网地址)的洞,那么Client A发送到187.34.1.56:40000的信息,Client B就能收到了。这个打洞命令由谁来发呢,呵呵,当然是Server S(就这个打洞没看懂)。
      

  6.   

    用广播方式借助服务器进行中转怎么样?
    ClientA和ClientB都是与服务器建立连接,如果要向对方发送信息,就把消息交给服务器(消息内包含了对方的IP地址),让服务器把消息广播出来,再由ClientA和ClientB分别对收到的广播消息进行过滤,如果消息的目的地址是本机IP就收下。
      

  7.   

    okjohn(大嘴青蛙):
    那就不算p2p了啊,传输数据要经过服务器中转,那就加重了服务器负担
      

  8.   

    用JXTA,在服务器上启一下JXTA服务(server peers)就行了,
    JXTA有纯java版的,而且还不错,
    理论上可以用手机在外面联系在家中的局域网的电脑