TODO:Golang UDP连接简单测试慎用Deadline

前端之家收集整理的这篇文章主要介绍了TODO:Golang UDP连接简单测试慎用Deadline前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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服务

  1. package main
  2. import (
  3. “fmt”
  4. “net”
  5. )
  6. func sendResponse(conn *net.UDPConn,addr *net.UDPAddr) {
  7. _,err := conn.WriteToUDP([]byte(“From server: Hello I got your mesage “),addr)
  8. if err != nil {
  9. fmt.Printf(“Couldn’t send response %v”,err)
  10. }
  11. }
  12. func main() {
  13. p := make([]byte,2048)
  14. addr := net.UDPAddr{
  15. Port: 12345,
  16. IP: net.ParseIP(“127.0.0.1”),
  17. }
  18. ser,err := net.ListenUDP(“udp”,&addr)
  19. if err != nil {
  20. fmt.Printf(“Some error %vn”,err)
  21. return
  22. }
  23. for {
  24. _,remoteaddr,err := ser.ReadFromUDP(p)
  25. fmt.Printf(“Read a message from %v %s n”,p)
  26. if err != nil {
  27. fmt.Printf(“Some error %v”,err)
  28. continue
  29. }
  30. go sendResponse(ser,remoteaddr)
  31. }
  32. }

2.Golang UDP 客户端

  1. package main
  2. import (
  3. “bufio”
  4. “fmt”
  5. “net”
  6. “os”
  7. “time”
  8. )
  9. func main() {
  10. addr,err := net.ResolveUDPAddr(“udp”,“:12345”)
  11. if err != nil {
  12. fmt.Println(“net.ResolveUDPAddr fail.”,err)
  13. os.Exit(1)
  14. }
  15. socket,err := net.DialUDP(“udp”,nil,addr)
  16. if err != nil {
  17. fmt.Println(“net.DialUDP fail.”,err)
  18. os.Exit(1)
  19. }
  20. t := time.Now()
  21. socket.SetDeadline(t.Add(time.Duration(5 * time.Second)))
  22. // socket.SetWriteDeadline(t.Add(time.Duration(5 * time.Second)))
  23. // socket.SetReadDeadline(t.Add(time.Duration(5 * time.Second)))
  24. defer socket.Close()
  25. r := bufio.NewReader(os.Stdin)
  26. for {
  27. switch line,ok := r.ReadString(‘n’); true {
  28. case ok != nil:
  29. fmt.Printf(“bye bye!n”)
  30. return
  31. default:
  32. _,err := socket.Write([]byte(line))
  33. if err != nil {
  34. fmt.Println(“error send data,err:”,err)
  35. return
  36. }
  37. data := make([]byte,1024)
  38. _,remoteAddr,err := socket.ReadFromUDP(data)
  39. if err != nil {
  40. fmt.Println(“error recv data,err)
  41. return
  42. }
  43. fmt.Printf(“from %s:%sn”,remoteAddr.String(),string(data))
  44. }
  45. }
  46. }

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的时间戳。本文仅供参考,如果有相应场景,会使用到,^_^。


wxgzh:ludong86

猜你在找的Go相关文章