同步读写 TCP 套接字

我正在尝试与响应消息的 TCP 服务器通信:


package main


import (

    "net"

    "log"

)


func handleErr(err error) {

    if err != nil {

        log.Fatal(err)

    }

}


func main() {


    // connect

    host := "1.2.3.4:5678"

    conn, err := net.Dial("tcp", host)

    handleErr(err)

    defer conn.Close()


    // write to socket

    message := "Test\n"

    conn.Write([]byte(message))


    // read from socket

    // (assume response is 'Test\n')

    reply := make([]byte, 1024)

    conn.Read(reply)

    log.Println(string(reply))


}

我想要完成的是向另一端的套接字服务器发送消息,等待响应然后处理它。我似乎无法正确同步这些写入/读取操作以正确计时 - 现在读取操作似乎阻止了写入;我假设这是由于 Go 的异步性质造成的。这样做的惯用方法是什么?是 goroutines 吗?for { .. }读者的连续循环?一种sync.Wait机制?帮助表示赞赏。谢谢。


蝴蝶不菲
浏览 219回答 1
1回答

阿波罗的战车

您的代码应该可以正常工作。Golang 非常简单,不需要考虑同步读/写调用。[编辑] 需要明确的是:Go 的网络模型是同步的,就像任何旧式套接字程序一样。Go 使用内部高效的技巧来处理它,但作为程序员,您可以轻松地编写顺序代码,这就是 goroutines 的重点。够程可以像线程,但他们是如此便宜,你可以创建他们的LOT(又名纤维)。请记住,TCP 可能不会一次性发送所有片段。您应该始终检查返回值以确保所有内容都已发送。也许服务器只收到了一部分消息并等待更多,但您的客户端已经在等待答复?只是一个猜测。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go