2016-05-28 8 views
2

Ich versuche, einen UDP-Server zu verwenden, um kontinuierlich zu Datagrammen und einem http-Server zu hören, aber die Zeichenfolge "UDP-Server auf Port" und Befehl "Server .Run() "werden nie erreicht.Golang: Mixing Gin mit einem UDP-Server

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() 
} 

Wie kann ich es funktionieren lassen?

Antwort

1

Es gibt eine Endlosschleife in Ihrem Code.

for { 
    handleUDPConnection(conn) 
} 

Dies wird repetedly die handleUDPConnection Funktion zu, ohne jemals zu bewegen, bis das Programm beendet rufen

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

Vielleicht möchten Sie mit den Anschlüssen in einem Go-Thread beschäftigen. Dies wäre etwas mehr wie folgt:

//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 

Hoffe, das hilft!

* Eine Goroutine ist kein Thread. Es kann nützlich/einfach sein, so zu denken, aber sie unterscheiden sich deutlich. Here's an article erklären einige der Unterschiede und Vorteile.