本文主要是介绍一次对TCP打洞的网络测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在博客找了份基于tcp p2p连接的代码, 弄了台公网服务器测试,发现怎么也打不通,尝试两台客户端分别连路由器wifi和手机热点来改变网络环境测试都失败.
于是又弄了台内网服务器, 两台处于不同内网的电脑当客户端发现测试成功.
到底是为什么呢?查阅了许多资料, 我们知道tcp打洞是基于端口重用, 于是写了份代码测试
客户端
public class Client {public static void main(String[] args) {try {// 新建一个socket通道Socket socket = new Socket();// 设置reuseAddress为truesocket.setReuseAddress(true);//TODO在此输入外网地址和端口
// String ip2 = "172.16.1.38";
// String ip = "172.240.1.56";String ip = "42.51.5.178";String ip2 = "61.243.3.19";int port = 5000;System.out.println("1connect to " + ip + ":" + port);socket.connect(new InetSocketAddress(ip, port));Thread.sleep(3);Socket newsocket = new Socket();newsocket.setReuseAddress(true);newsocket.bind(new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), socket.getLocalPort()));System.out.println("2connect to " + ip2 + ":" + port);newsocket.connect(new InetSocketAddress(ip2, port));} catch (Exception e) {e.printStackTrace();}}
服务端
public class Server {public static void main(String[] args) {try {// 1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口ServerSocket serverSocket = new ServerSocket(5000);Socket socket = null;System.out.println("***服务器即将启动,等待客户端的连接***");// 循环监听等待客户端的连接while (true) {// 调用accept()方法开始监听,等待客户端的连接socket = serverSocket.accept();System.out.println("收到一个连接:" + socket.getInetAddress().getHostAddress() + ":" + socket.getPort());}} catch (IOException e) {e.printStackTrace();}}
}
测试结果:
在内网中的172.16.1.38/172.240.1.56重用连接成功,且两次公网ip和端口一样! 外网服务器42.51.5.178/61.243.3.19连接失败, 切换网络环境也是失败,应该是我这公网NAT不支持端口重用.
这篇关于一次对TCP打洞的网络测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!