読者です 読者をやめる 読者になる 読者になる

簡単な UDP client / server in golang

UDP server と client の覚書。Ping を送って Pong と帰ってくるだけの雑なやつ。 特に難しいところもなくこの辺 みながらやると簡単にできる。

server 側

サーバ側では 127.0.0.1:8080 をlisten するようにしている。 何か送られてきたらそれを読んで、送ってきた相手に Pong と返すサーバ。

package main

import (
    "log"
    "net"
    "os"
)

func main() {
    udpAddr := &net.UDPAddr{
        IP:   net.ParseIP("127.0.0.1"),
        Port: 8080,
    }
    updLn, err := net.ListenUDP("udp", udpAddr)

    if err != nil {
        log.Fatalln(err)
        os.Exit(1)
    }

    buf := make([]byte, 1024)
    log.Println("Starting udp server...")

    for {
        n, addr, err := updLn.ReadFromUDP(buf)
        if err != nil {
            log.Fatalln(err)
            os.Exit(1)
        }

        go func() {
            log.Printf("Reciving data: %s from %s", string(buf[:n]), addr.String())

            log.Printf("Sending data..")
            updLn.WriteTo([]byte("Pong"), addr)
            log.Printf("Complete Sending data..")
        }()
    }
}

client 側

サーバに対して Pong と送信して、その返信をlogに出力する。

package main

import (
    "log"
    "net"
    "os"
)

func main() {
    conn, err := net.Dial("udp", "127.0.0.1:8080")
    if err != nil {
        log.Fatalln(err)
        os.Exit(1)
    }
    defer conn.Close()

    n, err := conn.Write([]byte("Ping"))
    if err != nil {
        log.Fatalln(err)
        os.Exit(1)
    }

    if len(buf) != n {
        log.Printf("data size is %d, but sent data size is %d", len(buf), n)
    }

    recvBuf := make([]byte, 1024)

    n, err = conn.Read(recvBuf)
    if err != nil {
        log.Fatalln(err)
        os.Exit(1)
    }

    log.Printf("Received data: %s", string(recvBuf[:n]))
}

参考

net - The Go Programming Language