在Golang中,可以直接使用net/http包提供的标准HTTP服务来实现同步IO。
代码示例:
同步TCP服务器:
go
func main() {
http.HandleFunc("/", handleRequest)
http.ListenAndServe(":8000", nil)
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
conn, _, err := w.(http.Hijacker).Hijack()
if err != nil {
log.Fatal(err)
}
// 处理连接,阻塞等待响应
handleConnection(conn)
}
func handleConnection(conn net.Conn) {
// ...
buf := make([]byte, 512)
conn.Read(buf)
conn.Write(buf)
// ...
}
服务器在handleRequest函数中获取 underlying TCP 连接,然后阻塞调用handleConnection进行处理,等待响应返回后才释放连接,继续处理其他请求。这就是典型的同步阻塞IO。
同步TCP客户端:
go
conn, err := net.Dial("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
// 发送请求,阻塞等待响应
_, err = conn.Write([]byte("data"))
if err != nil {
log.Fatal(err)
}
// 阻塞读取响应
buf := make([]byte, 512)
_, err = conn.Read(buf)
if err != nil {
log.Fatal(err)
}
客户端在写请求和读取响应时,都采用阻塞调用,首先等待上一步操作完成后才继续执行下一步,这同样实现了同步IO。