golang udp客户端无法从服务器接收消息

时间:2017-11-14 08:23:13

标签: go

我可以成功地将msg从客户端发送到服务器。但是当我尝试将消息回复给客户端时,客户端无法接收消息。

客户端:

conn, _:= net.Dial("udp", serv_addr:port)
defer conn.close()
buf:= []byte("Hey, server")
conn.Write(buf)

recv:= make([]byte, 1024)
fmt.Println("Reading...\n")
conn.Read(recv)

服务器:

addr, _:= net.ResolveUDPAddr("udp", addr:port)
msg := make([]byte, 1024)

conn,_: net.ListenUDP("udp", addr)
_, ret_addr, _: conn.ReadFromUDP(msg)
//print msg
conn.WriteToUDP([]byte("got your msg", ret)

这是一个非常简单的udp连接。服务器可以从客户端打印出msg,但在客户端,它在服务器完成任务时在conn.read()之前一直等待。

我关注this文章。我的实现几乎完全相同。

1 个答案:

答案 0 :(得分:1)

以下是您可以使用的最低代码。

在一个终端中启动服务器部分:

go run main.go server :53033

在另一个终端启动客户端:

go run main.go client :53033

现在在客户端终端输入消息,您应该看到客户端和服务器都交换消息。您可以启动多个客户端(在新的终端窗口中)并与同一服务器通信。

package main

import (
    "bufio"
    "fmt"
    "io"
    "log"
    "net"
    "os"
)

func server(url string) {
    log.Printf("serving on %s\n", url)
    addr, err := net.ResolveUDPAddr("udp", url)
    errcheck(err)

    conn, err := net.ListenUDP("udp", addr)
    errcheck(err)
    defer close(conn)

    msg := make([]byte, 1024)

    for {
        n, retAddr, err := conn.ReadFromUDP(msg)
        errcheck(err)

        log.Printf("received %v bytes, ret addr %v, msg %s", n, retAddr, string(msg[:n]))

        reply := []byte(fmt.Sprintf("received from you: %v bytes", n))
        n, err = conn.WriteToUDP(reply, retAddr)
        errcheck(err)

        log.Printf("sent reply %v bytes\n", n)
    }
}

func client(url string) {
    log.Printf("client for server url: %s\n", url)

    addr, err := net.ResolveUDPAddr("udp", url)
    errcheck(err)

    conn, err := net.DialUDP("udp", nil, addr)
    errcheck(err)
    defer close(conn)

    msg := make([]byte, 512)
    scanner := bufio.NewScanner(os.Stdin)
    for {
        if scanner.Scan() {
            line := scanner.Text()

            n, err := conn.Write([]byte(line))
            errcheck(err)
            log.Printf("sent %d bytes \n", n)

            n, err = conn.Read(msg)
            errcheck(err)
            log.Printf("server replied with: %s \n", string(msg[:n]))
        }
    }
}

func main() {
    args := os.Args[1:]

    if len(args) < 2 {
        log.Fatal("expecting 2 arguments client or server first followed by the address:port")
    }

    switch args[0] {
    case "server":
        server(args[1])

    case "client":
        client(args[1])

    default:
        log.Fatal("first argument must be server or client")
    }

}

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

func close(c io.Closer) {
    err := c.Close()
    if err != nil {
        log.Fatal()
    }
}

玩得开心!