不二又遇到奇怪的事情啦!在命令行中熟练的敲下脚手架命令后,潇洒的按下回车键,小嘬了一口茶,一切都是那么的丝滑。项目初始化完成后,又是两条熟悉的命令飞快的敲下,回车。屏幕上显示出了那条再熟悉不过的链接:localhost:3000
。脸上漏出了满意的微笑。
点开链接,麻痹的,这是啥?怎么就无法访问了?
虽然我平时都是在WSL下开发,按照微软写bug尿性,WSL出现各种奇怪的问题也不足为奇,但是讲道理,你要不行就都不行啊,为啥Vite就没问题呢?哦,对了,Vite的默认端口是5173
。难道是3000
端口被占用了?命令探究之。
lsof -i:3000
呵,啥都没有。转念又想难道是Windows下某个程序占用了3000
端口?又在PowerShell中执行了下面的命令。
netstat -aon|findstr "3000"
同样啥都没有!慌了,端口没被占用,程序能够起来,就是无法访问,怪,真怪!退出WSL,在Windows下又初始化了一份项目,启动,等等,这是啥提示?
3000端口已被占用,是否切换到别的端口?
不是查过3000
端口占用情况吗?没有被占用啊!怎么到你这儿就被占用了呢?先同意吧,咋?换的端口还不是3001
,这是什么情况?Google吧,在 https://github.com/docker/for-win/issues/3171 找到了原因。
因为我电脑上启用了沙盒功能(启用Hyper-V也会遇到这个问题),Windows保留了一些端口留着备用,处于备用的端口是无法被其他程序使用的,每次开机,系统都会随机保留一些端口。使用下面命令可以查看端口保留情况。
netsh interface ipv4 show excludedportrange protocol=tcp
解决方法有如下几种:
- 禁用Hyper-V和沙盒。
- 禁用Hyper-V和沙盒,添加需要排除的端口范围,重启Hyper-V和沙盒。
- 多次重启,直到需要的端口没被保留(如果不嫌累的话)。
重启winnet服务,本质上和重启电脑没什么区别,而且不是重启一次就一定可以解决问题的。
net stop winnat
net start winnat
也可以排除端口
# startport:开始端口
# numberofports:端口数
netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1
一劳永逸的做法:
netsh int ipv4 set dynamic tcp start=50000 num=15535
看到你对PHP这么专业,可以留个联系方式,聊一下的。