Go语言中想同时开http服务和监听tcp端口怎么做?

具体见代码,程序运行到m.Run()就不往下执行了
也就是说fmt.Println("!!!!!!!")执行不到
我现在想让他们同时工作。

我想他们同时执行

func main() {
    m := martini.Classic()
    m.Get("/device/:serialnumber" , func(params martini.Params) string {
        detail := GetDeviceState(params["serialnumber"])
        result , _ := json.Marshal(detail)
        return string(result)
    })

    m.Get("/device/ctrl/:serialnumber/:state" , func(params martini.Params) string {
        detail := DeviceStateUpdate(params["serialnumber"] , params["state"])
        result , _ := json.Marshal(detail)
        return string(result)
    })

    m.Run()
    fmt.Println("!!!!!!!")
    if len(os.Args) != 2 {
        fmt.Println("Usage:<command> <port>")
        return
    }

    port := os.Args[1]
    tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:"+port)
    handleError(err)
    tcpListener, err := net.ListenTCP("tcp4", tcpAddr)
    handleError(err)
    fmt.Println("TCPServer Listening at port:", port)
    defer tcpListener.Close()
    for {
        tcpConn, err := tcpListener.AcceptTCP()
        fmt.Printf("The client:%s has connected!\n", tcpConn.RemoteAddr().String())
        handleError(err)
        defer tcpConn.Close()
        go handleConn(tcpConn)
    }
}

阅读 9.9k
1 个回答

m.Run()是调用

http.ListenAndServe(host+":"+port, m)

这是阻塞的。

所以你要将m.Run()跑在一个goroutine

go m.Run()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题