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 :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)
}
}
}
現在沒有時間來測試或看看徹底,但你沒有檢查conn.Write錯誤() –
是啊你的權利,我必須做一個writeUDP從具有客戶端地址的服務器,以便能夠將消息發送到客戶端。在此之前,客戶端需要向服務器發送消息。我重寫了代碼,並且至少服務器和客戶端正在進行通信,但仍沒有數據正在被讀取。我能夠驗證數據是否正確寫入。 – ppone
我已經更新了問題中的代碼。 – ppone