You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于`telnet localhost`与`telnet 0.0.0.0`的疑问及Go监听程序咨询

搞懂telnet localhost和telnet 0.0.0.0的区别

我来帮你把这两个命令的差异掰扯清楚,结合你写的Go程序拆解,你就能明白核心问题在哪了:

先明确两个地址的本质

  • 0.0.0.0(服务端视角):这是个「通配符」地址,意思是绑定到机器上所有可用的网络接口。比如你有本地回环网卡(127.0.0.1)、办公室局域网网卡(192.168.1.100),绑定0.0.0.0:9999后,这两个网卡的9999端口都会被监听——不管是本机进程,还是局域网里其他同事的电脑,都能连这个端口(如果防火墙允许的话)。
  • localhost/127.0.0.1:这是本地回环地址,完全是「本机内部玩」的地址。绑定到127.0.0.1:9999的服务,只有你自己机器上的进程能连,外部设备根本访问不到。

结合你的Go程序看问题

先把你没写完的代码补全,方便分析:

package main

import (
	"fmt"
	"net"
	"time"
)

func main() {
	go bind("0.0.0.0:9999", "111 ")
	go func() {
		time.Sleep(2 * time.Second)
		bind("127.0.0.1:9999", "222 ")
	}()
	time.Sleep(time.Hour)
}

func bind(address string, content string) {
	fmt.Println("-------------", address, "-----------------")
	listener, err := net.Listen("tcp", address)
	if err != nil {
		panic(err)
		return
	}
	fmt.Println(listener.Addr().String())
	conn, _ := listener.Accept()
	for {
		_, err := conn.Write([]byte(content))
		if err != nil {
			break
		}
		time.Sleep(time.Second)
	}
}

这里有个关键细节你可能没注意到:当你先绑定0.0.0.0:9999后,再尝试绑定127.0.0.1:9999会直接panic。因为0.0.0.0已经占用了所有网络接口的9999端口,包括127.0.0.1,所以第二个监听会提示「端口被占用」。

如果我们分开测试(每次只启动一个监听):

  1. 只启动0.0.0.0:9999的服务:
    • 执行telnet localhost 9999:会成功连接,因为localhost会被解析成127.0.0.1,而0.0.0.0的监听包含这个接口,你会看到持续输出111 。
    • 执行telnet 0.0.0.0 9999:虽然能连上,但这其实是个「无效操作」——客户端用0.0.0.0作为目标地址没有实际意义,系统会自动把它解析成本地地址,最终还是连到同一个服务。实际开发中没人会这么写客户端连接地址。
  2. 只启动127.0.0.1:9999的服务:
    • 执行telnet localhost 9999:正常连接,输出222 。
    • 执行telnet 0.0.0.0 9999:大概率连不上,因为0.0.0.0作为客户端目标地址,系统可能尝试用非回环网卡去连接,而这个服务只绑定了回环接口,所以会失败。

一句话总结

  • 服务端用0.0.0.0:对外开放,允许所有来源连接;用127.0.0.1:仅限本机访问。
  • 客户端用telnet localhost:就是连本机回环服务;用telnet 0.0.0.0:是不规范的写法,没有实际用途,甚至可能连接失败。

内容的提问来源于stack exchange,提问作者Freewind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:43:22