我正在编写一个应用程序,它既应该侦听传入的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函数,没有返回任何值。我将非常感谢任何建议或示例如何正确地做到这一点。