【发布时间】:2025-12-20 10:05:06
【问题描述】:
我必须编写一个客户端代码,它以字符串的形式从服务器接收消息,并从控制台获取输入以结束向服务器发送消息。这两个操作应该彼此同时运行。我编写了一个代码来执行这些操作,但不是同时执行。
这是我当前的代码:
func SocketClient() {
conn, err := net.Dial("tcp", ":9000")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
server_reader := bufio.NewReader(conn)
input_reader := bufio.NewReader(os.Stdin)
for {
// for sending messages
buff, err := input_reader.ReadString('\n')
if err != nil {
log.Fatalln(err)
}
conn.Write([]byte(buff))
// for receiving messages but this won't run until the above has taken input from console
buff2, err := server_reader.ReadString('\n')
if err != nil {
log.Fatalln(err)
}
fmt.Println("Received: %s", buff2)
}
}
buff 接收来自服务器的传入消息,然后 buff2 从控制台获取传出消息输入,但为了再次接收传入消息,buff2 需要一些输入。我知道这可以使用通道、互斥锁等来完成,但是由于我对基础知识缺乏了解,我在使用它们时遇到了问题。
我猜实际的代码应该是这样的:
func SocketClient() {
conn, err := net.Dial("tcp", ":9000")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
go func() {
// for sending messages
} ()
go func() {
// for receiving messages
} ()
}
如何让输入和输出成为两个独立的 goroutine?
【问题讨论】:
-
互斥锁用于同步访问一些共享数据,所以这里不适用。将它们分开看起来就像你写的一样:一个例程从
conn读取并打印到标准输出,一个从标准输入读取并写入conn;你已经有了做这些事情的代码。您是否尝试过以这种方式实际实施它?您遇到了什么问题? -
关于术语的注释:您不编写 goroutines。您编写在 goroutine 中执行的函数。把 goroutine 想象成线程。
标签: go networking tcp websocket server