TODO:Golang UDP連接簡單測試慎用Deadline
UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規范。UDP在IP報文的協議號是17。在網絡中它與TCP協議一樣用於處理數據包,是一種無連接的協議。在OSI模型中,在第四層——傳輸層,處於IP協議的上一層。UDP有不提供數據包分組、組裝和不能對數據包進行排序的缺點,也就是說,當報文發送之后,是無法得知其是否安全完整到達的。
1.Golang UDP服務
- package main
- import (
- “fmt”
- “net”
- )
- func sendResponse(conn *net.UDPConn, addr *net.UDPAddr) {
- _, err := conn.WriteToUDP([]byte(“From server: Hello I got your mesage “), addr)
- if err != nil {
- fmt.Printf(“Couldn’t send response %v”, err)
- }
- }
- func main() {
- p := make([]byte, 2048)
- addr := net.UDPAddr{
- Port: 12345,
- IP: net.ParseIP(“127.0.0.1”),
- }
- ser, err := net.ListenUDP(“udp”, &addr)
- if err != nil {
- fmt.Printf(“Some error %vn”, err)
- return
- }
- for {
- _, remoteaddr, err := ser.ReadFromUDP(p)
- fmt.Printf(“Read a message from %v %s n”, remoteaddr, p)
- if err != nil {
- fmt.Printf(“Some error %v”, err)
- continue
- }
- go sendResponse(ser, remoteaddr)
- }
- }
2.Golang UDP 客戶端
- package main
- import (
- “bufio”
- “fmt”
- “net”
- “os”
- “time”
- )
- func main() {
- addr, err := net.ResolveUDPAddr(“udp”, “:12345”)
- if err != nil {
- fmt.Println(“net.ResolveUDPAddr fail.”, err)
- os.Exit(1)
- }
- socket, err := net.DialUDP(“udp”, nil, addr)
- if err != nil {
- fmt.Println(“net.DialUDP fail.”, err)
- os.Exit(1)
- }
- t := time.Now()
- socket.SetDeadline(t.Add(time.Duration(5 * time.Second)))
- // socket.SetWriteDeadline(t.Add(time.Duration(5 * time.Second)))
- // socket.SetReadDeadline(t.Add(time.Duration(5 * time.Second)))
- defer socket.Close()
- r := bufio.NewReader(os.Stdin)
- for {
- switch line, ok := r.ReadString(‘n’); true {
- case ok != nil:
- fmt.Printf(“bye bye!n”)
- return
- default:
- _, err := socket.Write([]byte(line))
- if err != nil {
- fmt.Println(“error send data,err:”, err)
- return
- }
- data := make([]byte, 1024)
- _, remoteAddr, err := socket.ReadFromUDP(data)
- if err != nil {
- fmt.Println(“error recv data,err:”, err)
- return
- }
- fmt.Printf(“from %s:%sn”, remoteAddr.String(), string(data))
- }
- }
- }
3.可以把代表拷貝的本地運行測試,Golang的設置方法有三個:SetDeadline,SetWriteDeadline,SetReadDeadline,設置了Deadline是指定時間戳為超時點,操作指定時間戳連接就會超時,再次發送包,接受包就會超時會提示i/o timeout
error send data,err: write udp 127.0.0.1:51608->127.0.0.1:12345: i/o timeout
error recv data,err: read udp 127.0.0.1:51608->127.0.0.1:12345: i/o timeout
所以要保持心跳在線就需要不斷刷新Deadline的時間戳。本文僅供參考,如果有相應場景,會使用到,^_^。
