Golang:同步对TCP套接字的读写

时间:2014-03-09 08:30:11

标签: sockets go read-write

我正在尝试与响应消息的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机制?感谢帮助。感谢。

1 个答案:

答案 0 :(得分:1)

你的代码应该工作应该工作得很好。 Golang很简单,没有必要考虑同步读/写调用。

[编辑]要明确:Golang网络模型是同步的,就像任何旧式套接字程序一样。 Golang使用内部有效的技巧来处理它,但作为程序员,您可以很方便地编写顺序代码,这是关于goroutines的全部观点。 Goroutines可以像线程一样,但是它们非常便宜,你可以创建很多它们(a.k.a。fibers)。

请记住,TCP可能不会一次性发送每个部分。您应该始终检查返回值以确保所有内容都已发送。也许服务器只收到部分消息并等待更多,但您的客户端已在等待答案?只是一个猜测..