2016-05-28 3 views
2

Я пытаюсь использовать как UDP-сервер для непрерывного прослушивания дейтаграмм, так и http-сервера, но строка «UDP-сервер и прослушивание на порту ...» и команда «server» .Run() "никогда не достигаются.Golang: Смешивание Джин с UDP-сервером

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

Как я могу заставить его работать?

ответ

1

В вашем коде есть бесконечный цикл.

for { 
    handleUDPConnection(conn) 
} 

Это repetedly вызова функции handleUDPConnection до выхода из программы никогда не переходить к

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

Может быть, вы хотите иметь дело с соединениями в ходе поток. Это было бы примерно так:

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

Надеюсь, это поможет!

* goroutine не является нитью. Это может быть полезно/просто думать об этом так, но они совершенно разные. Here's an article, объясняя некоторые отличия и преимущества.