【发布时间】:2018-05-26 19:24:45
【问题描述】:
我正在用 Go 编写 TCP 服务器和客户端,作为熟悉这种语言的工作示例。我想编写一个服务器,我们称之为 MyServer,它执行以下操作 - 它有一个后端 TCP 服务器,它侦听传入的消息,但它也有一个客户端,它允许他发送其他消息,独立于接收到的一次。但是,我不知道如何告诉 MyServer 在不阻塞主线程的情况下“在后台”监听。这是我的 TCPServer 的代码:
package main
import (
"fmt"
"net"
"os"
)
func main() {
startListener()
doOtherThins()
}
func startListener() {
listener, err := net.Listen("tcp", "localhost:9998")
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
defer listener.Close()
fmt.Println("Listening on " + "localhost:9998")
for {
// Listen for an incoming connection.
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error during accepting: ", err.Error())
os.Exit(1)
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
buf := make([]byte, 1024)
_, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
}
conn.Write([]byte("Message correctly received."))
conn.Close()
}
函数startListener()阻塞了主函数,所以函数doOtherThins()(我想独立发送数据包到其他服务器)永远不会被触发,只要服务器正在监听。我试图改变 main 函数并使用 goroutine:
func main() {
go startListener()
doOtherThins()
}
但是服务器没有监听传入的数据包(它只是触发doOtherThins()并结束main())。
是否可以在后台旋转监听器,让主线程也可以执行其他操作?
【问题讨论】: