Go中的UDP服务器/客户端不读取数据

我用 Go 编写了一个 UDP 服务器和客户端。当服务器运行时port 1200,我没有看到任何错误消息,当客户端尝试连接到同一台机器上的端口 1200 时,我也没有看到任何错误(OS X 10.9.1)


服务器没有在无限循环中打印“SOS ...”,即客户端正在写入的消息。


虽然客户端能够向服务器发送消息,但是服务器读取的是 0 字节。


服务器代码


package main


import ( "net" "fmt" "time" )


func main() {


        port := "127.0.0.1:1200"


        udpAddress, err := net.ResolveUDPAddr("udp4",port)


        if err != nil {

                fmt.Println("error resolving UDP address on ", port)

                fmt.Println(err)

                return

        }


        conn ,err := net.ListenUDP("udp",udpAddress)


        if err != nil {

                fmt.Println("error listening on UDP port ", port)

                fmt.Println(err)

                return

        }


        defer conn.Close()


        var buf []byte


        for {


                time.Sleep(100 * time.Millisecond)


                n,address, err := conn.ReadFromUDP(buf)


                if err != nil {

                        fmt.Println("error reading data from connection")

                        fmt.Println(err)

                        return

                }


                if address != nil {


                        fmt.Println("got message from ", address, " with n = ", n)


                        if n > 0 {

                                fmt.Println("from address", address, "got message:", string(buf[0:n]), n)

                        }

                }

        }


}

客户端代码,运行在同一台服务器上,使用命令go run udp-client.go :1200或go run udp-client.go 127.0.0.1:1200


package main


import (

"fmt"

"net"

"os"

"time"

)


func main() {


        if len(os.Args) != 2{

                fmt.Fprintf(os.Stderr, "Usage:%s host:port", os.Args[0])

                os.Exit(1)

        }


        service := os.Args[1]


        fmt.Println("Connecting to server at ", service)


        conn, err := net.Dial("udp",service)


        if err != nil {

                fmt.Println("Could not resolve udp address or connect to it  on " , service)

                fmt.Println(err)

                return

        }



繁星淼淼
浏览 315回答 1
1回答

犯罪嫌疑人X

该UDPConn.ReadFromUDP方法读取数据,并把它放入您提供的切片。在您的情况下,此切片为零。因此,您的缓冲区没有为数据提供足够的空间。您可以通过更改服务器代码中的一行来解决此问题:var buf []byte = make([]byte, 1500)可能应该选择缓冲区大小以适合您的网络协议。或者您创建一个 64k 缓冲区,以便您可以接收最大大小的 udp 数据包。然而,这似乎有点浪费:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go