在Go语言中,你可以使用goroutine
和channel
来同时监听网络连接和终端输入。以下是一个简单的示例,展示了如何实现这一点。
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
// 创建一个channel用于传递消息
messageChan := make(chan string)
// 启动一个goroutine来监听网络连接
go listenForConnections(messageChan)
// 启动一个goroutine来监听终端输入
go listenForTerminalInput(messageChan)
// 主goroutine从channel中读取消息并打印
for {
msg := <-messageChan
fmt.Println("Received:", msg)
}
}
func listenForConnections(messageChan chan<- string) {
// 监听TCP连接
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error listening:", err.Error())
return
}
defer listener.Close()
fmt.Println("Listening on :8080")
for {
// 接受连接
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting:", err.Error())
continue
}
// 处理连接
go handleConnection(conn, messageChan)
}
}
func handleConnection(conn net.Conn, messageChan chan<- string) {
defer conn.Close()
// 读取数据
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
// 将数据发送到channel
messageChan <- string(buffer[:n])
}
func listenForTerminalInput(messageChan chan<- string) {
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
messageChan <- text
}
}
messageChan
: 这是一个chan string
类型的channel,用于在网络连接和终端输入之间传递消息。
listenForConnections
: 这个函数在一个单独的goroutine中运行,监听TCP连接。每当有新的连接时,它会调用handleConnection
函数来处理连接。
handleConnection
: 这个函数读取来自网络连接的数据,并将数据发送到messageChan
。
listenForTerminalInput
: 这个函数在另一个goroutine中运行,监听终端输入。每当用户输入一行文本时,它会将文本发送到messageChan
。
主goroutine: 主goroutine从messageChan
中读取消息并打印出来。
编译并运行程序:
go run main.go
程序会监听8080
端口,并等待终端输入。
你可以通过telnet
或其他工具连接到localhost:8080
,并发送消息。程序会打印出接收到的消息。
你也可以在终端中输入文本,程序会打印出你输入的内容。
通过使用goroutine
和channel
,你可以轻松地在Go语言中同时监听网络连接和终端输入。这种方法利用了Go语言的并发特性,使得代码简洁且高效。