在Go语言中,你可以使用goroutine
和channel
来同时监听网络连接和终端输入。以下是一个简单的示例,展示了如何实现这一点。
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
// 创建一个channel用于在goroutine之间通信
connChan := make(chan net.Conn)
inputChan := make(chan string)
// 启动一个goroutine监听网络连接
go func() {
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
}
connChan <- conn
}
}()
// 启动一个goroutine监听终端输入
go func() {
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
inputChan <- text
}
}()
// 主goroutine处理来自两个channel的消息
for {
select {
case conn := <-connChan:
go handleConnection(conn)
case input := <-inputChan:
fmt.Println("You entered:", input)
}
}
}
// 处理网络连接的函数
func handleConnection(conn net.Conn) {
defer conn.Close()
fmt.Println("New connection from:", conn.RemoteAddr().String())
// 简单的回显服务器
reader := bufio.NewReader(conn)
for {
message, err := reader.ReadString('\n')
if err != nil {
fmt.Println("Connection closed:", conn.RemoteAddr().String())
return
}
fmt.Print("Received message: ", string(message))
conn.Write([]byte("Echo: " + message))
}
}
网络连接监听:
net.Listen
创建一个TCP监听器,监听在8080
端口。goroutine
中,使用listener.Accept()
接受新的连接,并将连接对象发送到connChan
通道。终端输入监听:
bufio.NewReader(os.Stdin)
创建一个读取器来读取终端输入。goroutine
中,读取用户输入并将其发送到inputChan
通道。主循环:
select
语句同时监听connChan
和inputChan
。goroutine
来处理该连接。处理连接:
handleConnection
函数处理每个连接,读取客户端发送的消息并回显。8080
端口并等待终端输入。telnet
或其他工具连接到localhost:8080
,发送消息,服务器会回显消息。通过使用goroutine
和channel
,你可以轻松地在Go语言中实现同时监听网络连接和终端输入的功能。这种模式非常适合需要同时处理多个I/O操作的并发场景。