首先介绍下我写的程序是C/S结构的聊天软件。服务器端负责用户登录,同时开启一个辅助打洞线程来记录客户的外网endpoint(记录完成后断开辅助打洞与客户端的连接)。
用户开始与其他特定用户聊天的时候首先查找自己记录与对方建立连接的Map,没有记录的话就靠自己的打洞机制开始建立与对方的连接。
问题就出在这个打洞机制上。
我目前的机制是这样的:用户A首先向服务器主连接socket发送打洞B请求,服务器受理然后把请求对象B的endpoint发给A,并通知B,A要打洞,当然也把A的endpoint告诉了B。A拿到B的endpoint后对B尝试建立连接然后断开。B拿到A的endpoint后会尝试连接下A然后发送给服务器B准备好了。A收到服务器主连接转发的B准备好以后就开始new ServerSocket()先绑定到与服务器辅助打洞端口连接的socket的socketAddress,然后告诉服务器A准备好了,然后开启ServerSocket,等待B的接入。B接收到A准备好的信息后就开始连接A。
实际过程中,我找一台有外网ip的机器当服务器,不同寝室的电脑做客户端(两个不同外网ip的寝室),结果是打洞请求方A一直收不到B的接入,B提示连接不到。
根据实际情况,我推断可能是打洞的时候不是绑定到与服务器辅助端口的socket的内网endpoint吗,既然绑定的时候没有异常那就是socket.bind(endpoint)这个方法不是这样用的;还有一种可能是我打洞机制的逻辑有问题。
求助有热心的朋友帮帮忙,在下感激不尽。

解决方案 »

  1.   

    大哥,你还没有分清楚UDP和TCP吗  UDP是可以用你刚才说的这种方法的。而你serverSocket是TCP呀!!
    怎么可能链接到一起,他们就根本不是同一个端口。
      

  2.   

    看你的意思,应该就是UDP穿透内网   !但是后来怎么又联系上TCP了呢!!
      

  3.   

    TCP不可以这样搞?如果指定用TCP穿透的话该怎么来呢 请高人指教