查看原文
其他

写了7年代码,第一次见这么狗血的小Bug!

鱼皮 程序员鱼皮 2024-01-21

大家好,我是程序员鱼皮。

孽起

Bug 年年有,今年特别多。前段时间给大家分享过一个 特别坑的小 Bug,结果这两天我个倒霉蛋又遇到一个特别离谱的 Bug,有多离谱?大家可以看看视频:https://www.bilibili.com/video/BV1Fc411y7HS

官方省流:我的后端 Spring Boot 项目在 8101 端口启动,启动后可以访问 localhost:8101/api/v3/api-docs 得到接口文档的 JSON 数据,我的前端需要这份数据来生成请求代码。

结果呢,生成一直错误。经过一番排查,我发现前端没有正确获取到 JSON 数据,而是得到了一个 hello world 字符串。

这一下子给我整懵了,hello world 哪来的?

于是我就打开浏览器,访问地址:127.0.0.1:8101/api/v3/api-docs ,结果竟然返回了 hello world!

奇怪了,我的后端程序可没有输出 hello world 的代码呀。于是我通过命令查看哪些程序占用了 8101 端口:

哦,原来是一个叫 aDrive 的程序也占用了 8101 端口!

这是一个知名的网盘软件,只要在 MAC 电脑上运行它,你访问本地的 8101 端口就能看到 hello world 了。

看到这,真是让我哭笑不得,没想到我自己做项目时用的端口号竟然和别的程序冲突了。

话说为啥要占用这个端口来输出 hello world 啊,测试代码忘删了么?

好了,Bug 大概介绍到这,接下来讲点小知识。

小知识

在很多同学的认知中:

1)同一个端口只能被一个程序占用。

或者说:同一个端口只能启动 1 个 Tomcat,否则就会冲突。

2)访问 localhost 和访问 127.0.0.1 得到的响应是一致的。

我说的没错吧?

有这些认识很正常,很多工作多年的大佬如果没经历过这样的 Bug,也会这么认为。

但其实这 2 个认识都是错误的。

1、同一个端口只能被一个程序占用?

这句话缺少了重要的条件。不同的网络协议是可以共享同一端口的。

比如我这次遇到的情况是,aDrive 和我的后端程序使用的网络协议不同,分别为 IPv4 和 IPv6,所以并不会冲突。

同理,TCP 和 UDP 作为两种不同的传输层协议,也可以使用相同的端口号。

2、localhost 不等于 127.0.0.1

首先,localhost  和 127.0.0.1  完全是两个不同的概念!

localhost 是 主机名 (hostname),它通常被用来表示本地计算机,并且默认被解析到 127.0.0.1 这个地址。

但是你只要修改主机文件(hosts),就可以把 localhost 解析到其他地址,跟域名解析类似。

而 127.0.0.1 是 IPv4 的一个特殊的 IP 地址,直接指向本地回环接口,用于在本地进行网络通信。

为了兼容 IPv4 和 IPv6,我们访问 localhost 时,操作系统会首先尝试解析 IPv6 的回环地址 ::1 。如果系统不支持 IPv6,或者无法解析为 IPv6 地址,才会继续解析为 IPv4 的回环地址 127.0.0.1。

而直接访问 127.0.0.1 时,系统会默认解析到 IPv4 的回环接口。这才导致输入这两个地址时,使用的服务 / 访问到的内容不一样。



ok,就是这样一个小 bug,也能学到很多的知识,希望有用,学会还请点个赞吧~

👇🏻 点击下方阅读原文,获取鱼皮往期编程干货。

往期推荐

鱼皮原创 7 大实战项目,保姆教程!

果然,大厂都在卷这个!

很痛苦,脱离视频教程就不会敲代码了。。。

小公司的需求评审,竟然是这样?

Java 异步编程,这样做就很简单!

几分钟,教你搭个 AI 绘画平台~

继续滑动看下一个

写了7年代码,第一次见这么狗血的小Bug!

鱼皮 程序员鱼皮
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存