Golang Socket编程绑定IP报错:请求的地址在其上下文中无效
Go 跨机器Socket通信正确实现方案
你遇到的bind: The requested address is not valid in its context错误,核心原因是服务端错误地绑定了客户端的IP地址。服务端的监听地址必须是自身机器的网卡IP,或者用0.0.0.0监听所有可用网卡,不能绑定其他机器的IP。
服务端代码
package main import ( "bufio" "fmt" "net" ) const ( SERVER_HOST = "0.0.0.0" // 监听所有网卡,也可替换为服务端自身IP(如192.168.137.178) SERVER_PORT = "4402" SERVER_TYPE = "tcp" ) func main() { // 启动监听 listener, err := net.Listen(SERVER_TYPE, SERVER_HOST+":"+SERVER_PORT) if err != nil { fmt.Println("监听失败:", err.Error()) return } defer listener.Close() fmt.Println("正在监听 " + SERVER_HOST + ":" + SERVER_PORT) fmt.Println("等待客户端连接...") // 接受客户端连接 conn, err := listener.Accept() if err != nil { fmt.Println("接受连接失败:", err.Error()) return } defer conn.Close() fmt.Println("客户端已连接,地址:", conn.RemoteAddr().String()) // 读取客户端消息 message, err := bufio.NewReader(conn).ReadString('\n') if err != nil { fmt.Println("读取消息失败:", err.Error()) return } fmt.Println("收到消息:", message) // 发送响应给客户端 _, err = conn.Write([]byte("消息已收到: " + message)) if err != nil { fmt.Println("发送响应失败:", err.Error()) return } }
客户端代码
package main import ( "bufio" "fmt" "net" "os" ) const ( SERVER_HOST = "192.168.137.178" // 填写服务端实际IP SERVER_PORT = "4402" SERVER_TYPE = "tcp" ) func main() { // 连接服务端 conn, err := net.Dial(SERVER_TYPE, SERVER_HOST+":"+SERVER_PORT) if err != nil { fmt.Println("连接服务端失败:", err.Error()) return } defer conn.Close() fmt.Println("已连接到服务端") // 读取用户输入并发送 fmt.Print("输入要发送的消息: ") reader := bufio.NewReader(os.Stdin) message, _ := reader.ReadString('\n') _, err = conn.Write([]byte(message)) if err != nil { fmt.Println("发送消息失败:", err.Error()) return } // 读取服务端响应 response, err := bufio.NewReader(conn).ReadString('\n') if err != nil { fmt.Println("读取响应失败:", err.Error()) return } fmt.Println("服务端响应:", response) }
关键注意事项
- 服务端监听地址:
0.0.0.0会监听所有可用网卡,适用于跨机器场景;如果指定具体IP,必须是服务端机器自身存在的网卡地址。 - 防火墙设置:确保服务端机器的防火墙开放了
4402端口,否则客户端无法建立连接。 - 网络验证:确认两台机器在同一网段,且能互相ping通(你已满足该条件)。
内容的提问来源于stack exchange,提问作者Daniel Perdana Putra
相关产品推荐
相关产品推荐

