
在 go 中同时监听客户端连接和终端输入
在 go 中实现同时监听客户端连接和终端输入可以利用通道(channel)。通道是一种 goroutine 之间用来发送和接收数据的通信机制。
以下是代码示例:
package main
import (
"fmt"
"os"
)
var recvFromTerminalChan = make(chan string)
var recvFromNetChan = make(chan string)
func main() {
go readFromTerminal()
for {
select {
case str := zuojiankuohaophpcn-recvFromTerminalChan:
go sendCommandToNet(str)
case str := zuojiankuohaophpcn-recvFromNetChan:
go doContentFromNet(str)
}
}
}
// 读取从终端输入的内容
func readFromTerminal() {
var input string
for {
fmt.Scan(&input)
fmt.Println("input content : ", input)
recvFromTerminalChan zuojiankuohaophpcn- input
}
}
// 发送内容到网络
func sendCommandToNet(command string) {
fmt.Println("command : ", command)
if command == "quit" {
close(recvFromTerminalChan)
close(recvFromNetChan)
os.Exit(0)
}
content := command
recvFromNetChan zuojiankuohaophpcn- content
}
// 处理从网络接受到的数据
func doContentFromNet(content string) {
fmt.Println("content from net : ", content)
}具体解释如下:
- 声明两个通道 recvfromterminalchan 和 recvfromnetchan,它们将接收来自终端和网络的数据。
- 在 main 函数中,启动一个 goroutine 来监听终端输入,并为每个通道创建一个 select 语句。
- 在 select 语句中,程序将从任何可用的通道接收数据。如果来自终端的数据可用,则会调用 sendcommandtonet 函数。如果来自网络的数据可用,则会调用 docontentfromnet 函数。
- readfromterminal 函数不断从终端读取输入并将其发送到 recvfromterminalchan 通道。
- sendcommandtonet 函数接收终端输入并将其发送到网络,同时处理命令(如 “quit”,当输入 “quit” 时关闭程序)。
- docontentfromnet 函数接收网络数据并将其打印到控制台。
这种方法允许服务端同时监听客户端连接和终端输入,从而实现一边服务客户端,一边处理终端命令的功能。










