简体   繁体   English

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

[英]UDP server / client in Go not reading data

I have written a UDP server and client in Go. 我在Go中编写了一个UDP服务器和客户端。 I am not seeing any error messages when the server is running on port 1200 , I also do not see any errors when client is trying to connect to port 1200 on the same machine (OS X 10.9.1) 当服务器在port 1200上运行时,我没有看到任何错误消息,当客户端尝试连接到同一台机器上的port 1200 ,我也没有看到任何错误(OS X 10.9.1)

The server is not printing "SOS...", that is the message the client is writing, in a infinite loop. 服务器没有在无限循环中打印“SOS ...”,即客户端正在编写的消息。

The client is able to send a message to the server though, however what the server is reading is 0 bytes. 客户端能够向服务器发送消息,但服务器正在读取的是0字节。

Server Code 服务器代码

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)
                        }
                }
        }

}

client code, running on same server, with command go run udp-client.go :1200 or go run udp-client.go 127.0.0.1:1200 客户端代码,运行在同一台服务器上,使用命令go run udp-client.go :1200go 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)
                }
        }

}

The UDPConn.ReadFromUDP method reads data and puts it into the slice you provided. UDPConn.ReadFromUDP方法读取数据并将其放入您提供的切片中。 In your case this slice is nil. 在你的情况下,这个切片是零。 Therefore your buffer does not provide enough space for data. 因此,您的缓冲区不能为数据提供足够的空间。 You can fix this by changing one line in the server code: 您可以通过更改服务器代码中的一行来解决此问题:

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

The buffer size should probably be chosen to fit your network protocol. 应该选择缓冲区大小以适合您的网络协议。 Or you create a 64k buffer so that you can receive maximum sized udp packets. 或者您创建一个64k缓冲区,以便您可以接收最大大小的udp数据包。 This however seems a bit wastefull :) 然而这似乎有点浪费:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM