2013-12-22 38 views
6

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

服务器不是印刷“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 :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) 
       } 
     } 

} 
+1

现在没有时间来测试或看看彻底,但你没有检查conn.Write错误() –

+0

是啊你的权利,我必须做一个writeUDP从具有客户端地址的服务器,以便能够将消息发送到客户端。在此之前,客户端需要向服务器发送消息。我重写了代码,并且至少服务器和客户端正在进行通信,但仍没有数据正在被读取。我能够验证数据是否正确写入。 – ppone

+0

我已经更新了问题中的代码。 – ppone

回答

7

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

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

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