登录
首页 >  Golang >  Go问答

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

来源:SegmentFault

时间:2023-01-09 15:44:09 483浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Go语言中想同时开http服务和监听tcp端口怎么做?》,聊聊go,希望可以帮助到正在努力赚钱的你。

问题内容

具体见代码,程序运行到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:")
        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)
    }
}

正确答案

m.Run()是调用

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

这是阻塞的。

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

go m.Run()

好了,本文到此结束,带大家了解了《Go语言中想同时开http服务和监听tcp端口怎么做?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表