gpt4 book ai didi

go - 修复 Go 中的错误连接

转载 作者:数据小太阳 更新时间:2023-10-29 03:11:42 25 4
gpt4 key购买 nike

我有一个客户端正在向(从)服务器发送(接收)数据。客户端的代码类似于:

conn, _ := net.Dial("tcp", "127.0.0.1:3456")
reader := bufio.NewReader(conn)
writer := bufio.NewWriter(conn)

for true {
writer.write(data)
reader.read()
}

现在,假设服务器经常崩溃导致 conn 出错。这意味着 for 循环中的 writeread 方法不会执行任何操作,只会返回一个 error .即使服务器在接下来的几秒钟内再次启动,客户端的 for 循环代码也将无法与服务器通信,因为 conn 出现故障。

我想要实现的是:让客户端在服务器再次恢复时继续运行。为此,我想到了以下方法:

    func fixConnection(conn *net.Conn, reader **[]bufio.Reader, writer **[]bufio.Writer) net.Conn {

for true {

oneByte := make([] byte, 1, 1)
reader := bufio.NewReader(*conn)
_, err := reader.Read(oneByte)
if err != nil {
for true {
var tmpConn net.Conn
tmpConn, err = net.Dial("tcp", "127.0.0.1:3456")
if err == nil {
*conn = tmpConn
*reader = bufio.NewReader(*conn)
*writer = bufio.NewWriter(*conn)
}
time.Sleep(time.Millisecond * 100)
}
} else {
reader.UnreadByte()
time.Sleep(time.Millisecond * 500)
continue
}

}
}

然后我只在客户端添加一行:

conn, _ := net.Dial("tcp", "127.0.0.1:3456")
reader := bufio.NewReader(conn)
writer := bufio.NewWriter(conn)

// new line
go fixConnection(&conn, &reader, &writer)

for true {
writer.write(data)
reader.read()
}

我的方法至少有一个问题:bufio 不是线程安全的,因此当 fixConnection 改变读者(作者)时可能存在问题。有没有办法在对读取器/写入器进行操作之前不使用 sync.Mutex 来解决这个问题。

另外,有没有更好的方法来解决我前面提到的问题。也就是说,当服务器再次恢复时再次连接到服务器?请注意,服务器可以在任何时间点接受多个客户端的连接。

最佳答案

也许只是检查错误,像这样

func connect(addr string)(*bufio.Reader, *bufio.Writer, Error){
conn, err := net.Dial("tcp", addr) reader := bufio.NewReader(conn)
if err != nill{
return(nil, nil, err)
}
writer := bufio.NewWriter(conn)
reader := bufio.NewReader(conn)
return(reader, writer, nil)
}
for reader, writer, err := connect(adrr);;{
if err !=nil {
reader, writer, err = connect(adrr)
continue
}
_, err = writer.write(data)
err = reader.read()
}

关于go - 修复 Go 中的错误连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50021730/

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