
go语言中同时监听客户端连接和终端命令
在 go 语言中,实现一边监听新的客户端连接请求,一边处理终端输入命令需要使用并发机制。
解决方法:
- 创建两个通道:recvfromterminalchan 和 recvfromnetchan,用于分别接收终端输入和网络数据。
- 启动一个 goroutine 用于从终端读取输入并将其发送到 recvfromterminalchan 通道。
- 在一个无限循环中使用 select 语句监听两个通道。当有数据写入通道时,相应的 goroutine 被触发。
示例代码:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"os"
)
var recvFromTerminalChan = make(chan string)
var recvFromNetChan = make(chan string)
func main() {
go readFromTerminal()
for {
select {
case str := <-recvFromTerminalChan:
go sendCommandToNet(str)
case str := <-recvFromNetChan:
go doContentFromNet(str)
}
}
}
func readFromTerminal() {
var input string
for {
fmt.Scan(&input)
fmt.Println("input content : ", input)
recvFromTerminalChan <- input
}
}
func sendCommandToNet(command string) {
fmt.Println("command : ", command)
if command == "quit" {
close(recvFromTerminalChan)
close(recvFromNetChan)
os.Exit(0)
}
content := command
recvFromNetChan <- content
}
func doContentFromNet(content string) {
fmt.Println("content from net : ", content)
}注意事项:
- 当终端输入命令为 "quit" 时,关闭两个通道并退出程序。
- 优化代码可考虑使用缓冲通道,避免因通道阻塞导致程序停滞。










