这个看似简单的例子并没有按预期工作,我觉得问这个问题很糟糕,但这里是:
有一个客户端重试连接到服务器,发送消息,然后等待响应:
func client() {
var conn net.Conn
var err error
// retry server until it is up
for {
conn, err = net.Dial("tcp", ":8081")
if err == nil {
break
}
log.Println(err)
time.Sleep(time.Second)
}
// write to server
_, err = conn.Write([]byte("request"))
if err != nil {
log.Println(err)
return
}
// block & read from server
var buf []byte
n, err := conn.Read(buf)
if err != nil {
log.Println(err)
return
}
log.Printf("From server: %s\n", buf[:n])
}
它连接到一个服务器,该服务器对于每个连接,读取并解释发送的数据,并在需要时发送响应:
func server() {
ln, _ := net.Listen("tcp", ":8081")
for {
conn, _ := ln.Accept()
go handleConn(conn)
}
}
func handleConn(conn net.Conn) {
var buf []byte
n, err := conn.Read(buf)
if err != nil {
return
}
log.Printf("Server got: %s\n", buf)
if string(buf[:n]) == "request" {
_, _ = conn.Write([]byte("response"))
}
}
全部由main函数驱动:
func main() {
go client()
server()
}
为了简洁起见,省略了错误处理。预期的行为是客户端将连接到服务器并发送消息“请求”,然后阻止读取。服务器接收“请求”并将消息“响应”发送回同一连接。客户端解锁,打印收到的消息并退出。相反,当程序运行时,会打印以下内容:
2019/09/01 22:24:02 From server:
2019/09/01 22:24:02 Server got:
表明没有数据交换,并且客户端没有阻塞。
www说
相关分类