UDP服务器/客户端在Go中未读取数据
我已经在Go中编写了一个UDP服务器和客户端。当服务器在UDP服务器/客户端在Go中未读取数据,udp,go,Udp,Go,我已经在Go中编写了一个UDP服务器和客户端。当服务器在端口1200上运行时,我没有看到任何错误消息,当客户端尝试连接到同一台机器上的端口1200时,我也没有看到任何错误(OS X 10.9.1) 服务器没有在无限循环中打印“SOS…”,即客户端正在编写的消息 客户端可以向服务器发送消息,但是服务器读取的是0字节 服务器代码 package main import ( "net" "fmt" "time" ) func main() { port := "127.0.0.1
端口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)
}
}
}
UDPConn.ReadFromUDP方法读取数据并将其放入您提供的切片中。
在你的情况下,这个切片是零。因此,缓冲区没有为数据提供足够的空间。
您可以通过更改服务器代码中的一行来解决此问题:
var buf []byte = make([]byte, 1500)
缓冲区大小的选择可能适合您的网络协议。或者创建64k缓冲区,以便可以接收最大大小的udp数据包。不过,这似乎有点浪费:)现在没有时间进行测试或彻底检查,但您没有检查conn上的错误。Write()是的,我必须使用客户端的地址从服务器执行writeUDP,才能将消息发送到客户端。在此之前,客户端需要向服务器发送消息。我重写了代码,至少服务器和客户端正在通信,但仍然没有读取数据。我能够验证数据是否正确写入。我已经更新了问题中的代码。