gpt4 book ai didi

Golang TCP 服务器给出 "dial tcp 127.0.0.1:9999: connect: connection refused"错误

转载 作者:行者123 更新时间:2023-12-01 22:00:30 31 4
gpt4 key购买 nike

我正在从书中学习An Introduction to Programming in Go by Caleb Doxsey

In chapter 13 about servers我们得到了代码:

package main

import (
"encoding/gob"
"fmt"
"net"
)

func server() {
// listen on a port

ln, err := net.Listen("tcp", ":9999")

if err != nil {
fmt.Println("server, Listen", err)
return
}

for {
// accept a connection
c, err := ln.Accept()
if err != nil {
fmt.Println("server, Accept", err)
continue
}
// handle the connection
go handleServerConnection(c)
}
}

func handleServerConnection(c net.Conn) {
// receive the message
var msg string
err := gob.NewDecoder(c).Decode(&msg)
if err != nil {
fmt.Println("handleServerConnection", err)
} else {
fmt.Println("Received", msg)
}

c.Close()
}

func client() {
// connect to the server
c, err := net.Dial("tcp", "127.0.0.1:9999")
if err != nil {
fmt.Println("client, Dial", err)
return
}

// send the message
msg := "Hello World"
fmt.Println("Sending", msg)
err = gob.NewEncoder(c).Encode(msg)
if err != nil {
fmt.Println("client, NewEncoder", err)
}

c.Close()
}

func main() {
go server()
go client()

var input string
fmt.Scanln(&input)
}

运行这段代码我几乎总是收到:

client, Dial dial tcp 127.0.0.1:9999: connect: connection refused

但有时我会收到:

Sending Hello World

Received Hello World

我还发现,如果我只运行与客户端分开的服务器,然后在单独的文件上运行客户端,它会按预期工作。这是为什么?

最佳答案

Listen和Dial是并发调用的,你无法预测哪个先执行。如果 Dial 在 Listen 之前执行,那么显然还没有任何监听,这会产生错误。

在启动 goroutines 之前,在 main 中调用 Listen:

func main() {
ln, err := net.Listen("tcp", ":9999")
if err != nil {
fmt.Fatal("server, Listen", err)
}

go server(ln)
go client()

var input string
fmt.Scanln(&input)
}

func server(ln net.Listener) {
for {
// accept a connection
c, err := ln.Accept()
if err != nil {
fmt.Println("server, Accept", err)
continue
}
// handle the connection
go handleServerConnection(c)
}
}

关于Golang TCP 服务器给出 "dial tcp 127.0.0.1:9999: connect: connection refused"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63812531/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com