TODO:Golang UDP连接简单测试慎用Deadline
来源:互联网 发布:新淘宝店铺转让价格表 编辑:程序博客网 时间:2024/05/24 06:28
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的时间戳。本文仅供参考,如果有相应场景,会使用到,^_^。
wxgzh:ludong86
0 0
- TODO:Golang UDP连接简单测试慎用Deadline
- 简单的JAVA UDP连接测试
- TODO:Golang语言TCP/UDP协议重用地址端口
- golang todo实例
- golang udp
- TODO:Golang指针使用注意事项
- Deadline
- Java IO——UDP连接测试
- TODO:Golang Linux进程退出说明
- golang p2p udp server
- Golang 测试
- 简单的python UDP服务器客户端连接
- Asp.net core与golang web简单对比测试
- dbcp连接数据库简单测试
- 简单测试连接mysql数据库
- golang udp服务端客户端例子
- emacs todo-mode 简单实用
- TODO:Laravel 内置简单登录
- base64图片在jasperreport模板中显示
- Java类、属性、方法分类及修饰符整合
- 自定义View实例(二)----一步一步教你实现QQ健康界面
- Python3基础:String模块ascii_letters和digits
- UVA - 141 The Spot Game
- TODO:Golang UDP连接简单测试慎用Deadline
- dp 动规 最佳加法表达式
- 图论:聚集系数的求法(针对复杂网络)
- python学习笔记 操作文件和目录
- Java核心技术点之多线程
- Android 从应用到linux驱动
- Java学习2:基于Intellij IDEA开发一个简单的Web Application
- ActionMode 操作模式
- 必备15大技能