【发布时间】:2020-04-19 21:23:03
【问题描述】:
我是 golang 的新手,我正在尝试在 go 中构建一个简单的 TCP 服务器和客户端。 客户端向服务器发送消息“来自客户端的问候”,并等待服务器响应 消息“已成功处理”。问题是客户端在我调用 conn.Close() 或在客户端上按 CTRL+C 之前不会刷新数据,如果我按 CTRL+C 或关闭连接,客户端将退出但不等待服务器的消息。服务器卡在这一行
n, copyErr := io.Copy(temp, conn)
有人可以帮我解决这个问题吗?
client.go
package main
import (
"fmt"
"io/ioutil"
"net"
)
func writeMessage(conn net.Conn) {
msg := "Hello from Client"
_, writeErr := conn.Write([]byte(msg))
if writeErr != nil {
fmt.Println("Write error", writeErr)
}
}
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("Dial error", err)
}
writeMessage(conn)
msg, err := ioutil.ReadAll(conn)
fmt.Println("Received message", string(msg), "from", conn.RemoteAddr())
}
server.go
package main
import (
"bytes"
"fmt"
"io"
"net"
"os"
)
func handleConn(conn net.Conn) {
localAddr := conn.LocalAddr()
fmt.Println("Handling connection for", localAddr)
temp := new(bytes.Buffer)
n, copyErr := io.Copy(temp, conn)
if copyErr != nil {
fmt.Println("Copy error:", copyErr)
}
fmt.Println("Processed", n, "bytes")
conn.Write([]byte("Successfully processed"))
}
func main() {
ln, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error creating TCP server")
os.Exit(1)
}
fmt.Println("Listening on port :8080")
for {
conn, err := ln.Accept()
if err != nil {
fmt.Println("Connection error")
}
handleConn(conn)
}
}
【问题讨论】: