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

 手机用户2502927973 发布于 2023-02-08 16:37

我在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
        }

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

        defer conn.Close()

        fmt.Println("About to write to connection")

        for {

                time.Sleep(1000*time.Millisecond)
                n, err := conn.Write([]byte("SOS ... \n"))
                if err != nil {
                        fmt.Println("error writing data to server", service)
                        fmt.Println(err)
                        return
                }

                if n > 0 {
                        fmt.Println("Wrote ",n, " bytes to server at ", service)
                }
        }

}

Philipp.. 7

UDPConn.ReadFromUDP方法读取数据,并把它放入您提供的切片.在你的情况下,这个切片是零.因此,您的缓冲区不能为数据提供足够的空间.您可以通过更改服务器代码中的一行来解决此问题:

var buf []byte = make([]byte, 1500)

应该选择缓冲区大小以适合您的网络协议.或者您创建一个64k缓冲区,以便您可以接收最大大小的udp数据包.然而这似乎有点浪费:)

1 个回答
  • UDPConn.ReadFromUDP方法读取数据,并把它放入您提供的切片.在你的情况下,这个切片是零.因此,您的缓冲区不能为数据提供足够的空间.您可以通过更改服务器代码中的一行来解决此问题:

    var buf []byte = make([]byte, 1500)
    

    应该选择缓冲区大小以适合您的网络协议.或者您创建一个64k缓冲区,以便您可以接收最大大小的udp数据包.然而这似乎有点浪费:)

    2023-02-08 16:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有