Go:在tcp侦听器运行时允许键盘输入

时间:2018-01-31 20:36:33

标签: go input tcp infinite-loop

我正在编写一个应用程序,它既应该侦听传入的TCP 连接,也应该在请求时发送TCP数据包

我有一个简单的Listen函数,它接受传入的连接

func (a *App) Listen() {
    for {
        conn, err := a.listener.Accept()

        if err != nil {
            // log error
        } else {
            go ProcessConn(conn)
        }
    }
}

我还有一个Send功能,可以执行拨号以发送TCP数据包

func (a *App) Send(message []byte, host string, port string) error {

    conn, err := net.Dial("tcp", host+":"+port)

    if err != nil {
        return err
    } else {
        defer conn.Close()
    }

    _, err = conn.Write(message)
    return err
}

现在,当我使用Start函数启动我的应用程序时,它运行一个无限循环(用于侦听传入连接),因此从终端的角度来看,程序“冻结”并且不会对任何键盘操作做出反应(期望CTRL-C)。

func (a *App) Start() error {

    defer a.Listen()

    // perform some unrelated operations

    return nil
}

但是,我想改进我的应用程序,以这种方式,它可以采取用户(键盘)输入,以通知我的应用程序,它应该发送一条消息(我希望用户能够给参数:目的地的消息和地址。)我在这里阅读关于select语句:https://gobyexample.com/select。并希望将它用于我的应用程序。

这是我根据go网站上的例子写的:

func UserReacted(c2 chan string){
    for {
        reader := bufio.NewReader(os.Stdin)
        fmt.Print("Enter text: ")
        text, _ := reader.ReadString('\n')
        c2 <- text
    }
}

func main() {

    a := NewApp()
    a.Start()

    c1 := make(chan string)
    c2 := make(chan string)

    go func() {
        UserReacted(c2)
    }()


    for {
        select {
        case msg2 := <-c2:
            a.Send() // with some parameters added later
        default:
        }
    }
    <-finish
}

我理解go网站上的示例是如何工作的,但我不知道如何使用select,其中一个函数,在我的例子中是Listen函数,没有返回任何值。我将非常感谢任何建议或示例如何正确地做到这一点。

0 个答案:

没有答案