一次对TCP打洞的网络测试

在博客找了份基于tcp p2p连接的代码, 弄了台公网服务器测试,发现怎么也打不通,尝试两台客户端分别连路由器wifi和手机热点来改变网络环境测试都失败.
于是又弄了台内网服务器, 两台处于不同内网的电脑当客户端发现测试成功.
到底是为什么呢?查阅了许多资料, 我们知道tcp打洞是基于端口重用, 于是写了份代码测试

客户端


public class Client {

    public static void main(String[] args) {
        try {
            // 新建一个socket通道
            Socket socket = new Socket();
            // 设置reuseAddress为true
            socket.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不支持端口重用.

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TCP网络编程是指通过TCP协议来进行网络通信的编程技术。在考研中,理解和掌握TCP网络编程是具有一定帮助的。 首先,TCP网络编程是计算机网络课程的重要内容之一。在考研中,计算机网络是一个重要的考点,掌握TCP网络编程能够帮助我们更好地理解计算机网络的原理和工作机制,提高对计算机网络相关知识的掌握程度。 其次,掌握TCP网络编程可以提高我们的实际操作能力。在实验室或项目中,经常需要通过网络进行数据传输,尤其是在分布式系统或网络编程方面的实践中。掌握TCP网络编程技术可以帮助我们更好地实现和调试网络通信,提高项目开发和实验操作的效率。 此外,TCP网络编程与操作系统和并行计算有着密切的关联。在操作系统原理和并行计算等课程中,也会涉及到网络通信的相关知识。掌握TCP网络编程可以使我们更好地理解和应用这些知识,在深入研究操作系统原理和并行计算等领域时,能够更加灵活地处理与网络通信相关的问题。 综上所述,TCP网络编程对考研是具有帮助的。它不仅可以帮助我们更好地理解计算机网络的原理和工作机制,提高对计算机网络知识的掌握程度,还可以提高我们的实际操作能力,并与操作系统和并行计算等课程有着密切的关联。因此,在备考考研时,掌握TCP网络编程技术是一个有价值的学习方向。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值