一次对TCP打洞的网络测试

2024-03-15 12:20
文章标签 网络 测试 tcp 一次 打洞

本文主要是介绍一次对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打洞的网络测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/811974

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for