TonyChyi

我在那一角落患过抽风

Go的异步UDP服务器
2015年11月25日
 

 

package main

import(
    "net"
    "fmt"
    "strings"
    "runtime"
)

type Data struct{
    C string
    D *net.UDPAddr
}

func main(){
    runtime.GOMAXPROCS(runtime.NumCPU())
    addr, err := net.ResolveUDPAddr("udp", ":25252")  // Niconiconi~
    if err != nil{
        fmt.Println("!ERR:", err)
        return
    }

    conn, err := net.ListenUDP("udp", addr)
    if err != nil{
        fmt.Println("!ERR:", err)
        return
    }
    defer conn.Close()

    c := make(chan Data, 1024)  // 带缓冲的通道
    fmt.Println("Listen at 25252")
    for {
        data := make([]byte, 1024)
        read, fAddr, err := conn.ReadFromUDP(data)
        if err != nil {
            fmt.Println("!ERR:", err)
            continue
        }
        go sets(string(data[:read]), fAddr, c)  // 通过通道来接收数据
        select{
        case k:= <-c:
            conn.WriteToUDP([]byte(k.C), k.D)
        default:
        }
    }
}

func sets(k string, fAddr *net.UDPAddr, c chan Data){
    str := strings.ToLower(k)
    c <- Data{str, fAddr}
}

Tags: #Go · #Server

 

TonyChyi © 2020 GPLv2