插件窝 干货文章 Go语言并发编程:如何同时监听网络连接和终端输入?

Go语言并发编程:如何同时监听网络连接和终端输入?

messageChan 监听 连接 goroutine 208    来源:    2025-03-11

在Go语言中,你可以使用goroutinechannel来同时监听网络连接和终端输入。以下是一个简单的示例,展示了如何实现这一点。

示例代码

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
    }
}

代码说明

  1. messageChan: 这是一个chan string类型的channel,用于在网络连接和终端输入之间传递消息。

  2. listenForConnections: 这个函数在一个单独的goroutine中运行,监听TCP连接。每当有新的连接时,它会调用handleConnection函数来处理连接。

  3. handleConnection: 这个函数读取来自网络连接的数据,并将数据发送到messageChan

  4. listenForTerminalInput: 这个函数在另一个goroutine中运行,监听终端输入。每当用户输入一行文本时,它会将文本发送到messageChan

  5. 主goroutine: 主goroutine从messageChan中读取消息并打印出来。

运行示例

  1. 编译并运行程序:

    go run main.go
    
  2. 程序会监听8080端口,并等待终端输入。

  3. 你可以通过telnet或其他工具连接到localhost:8080,并发送消息。程序会打印出接收到的消息。

  4. 你也可以在终端中输入文本,程序会打印出你输入的内容。

总结

通过使用goroutinechannel,你可以轻松地在Go语言中同时监听网络连接和终端输入。这种方法利用了Go语言的并发特性,使得代码简洁且高效。