简体   繁体   中英

Golang: Mixing Gin with an UDP server

I'm trying to use both a UDP server to listen continuously to datagrams and a http server, but the string "UDP server up and listening on port..." and command "server.Run()" are never reached.

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "log"
    "net"
)

func handleUDPConnection(conn *net.UDPConn) {
    buffer := make([]byte, 8096)
    n, addr, err := conn.ReadFromUDP(buffer)

    if err != nil {
        log.Fatal(err)
    } else {
        fmt.Println("UDP client: ", addr)
        fmt.Println("Received from UDP client: ", string(buffer[:n]))
    }
}

func main() {
    server := gin.Default()
    host, port := "localhost", "41234"
    udpAddr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf("%s:%s", host, port))

    if err != nil {
        log.Fatal(err)
    }

    conn, err := net.ListenUDP("udp", udpAddr)
    if err != nil {
        log.Fatal(err)
    }

    defer conn.Close()
    server.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{"message": "pong"})
    })

    for {
        handleUDPConnection(conn)
    }

    fmt.Sprintf("UDP server up and listening on port %s\n", port)
    server.Run()
}

How can I make it work?

There is an infinite loop in your code.

for {
    handleUDPConnection(conn)
}

This will repetedly call the handleUDPConnection function until the program exits without ever moving on to

fmt.Sprintf("UDP server up and listening on port %s\n", port)
server.Run()

Perhaps you want to deal with the connections in a go thread. This would be something more like this:

//define an exit variable
keepListening := true
//spawn a go routine (starts the function on another thread*)
go func() {
    for keepListening {
        handleUDPConnection(conn)
    }
}()
//notify the user that the server is listening
fmt.Sprintf("UDP server up and listening on port %s\n", port)
//run the server (I assume this function call is blocking
server.Run()
//stop the go routine when the server is done running
keepListening = false

Hope this helps!

*a goroutine is not a thread. It can be useful/simple to think of it like that, but they are distinctly different. Here's an article explaining some of the differences and advantages.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM