2013-12-22 70 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數據包。這似乎有點浪費:)