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的时间戳。本文仅供参考,如果有相应场景,会使用到,^_^。
相关推荐
在本文中,我们将深入探讨如何使用Golang(Go语言)构建UDP服务器和客户端。Go语言以其简洁、高效和并发特性,常被用于网络编程,包括UDP通信。UDP(用户数据报协议)是一种无连接的传输层协议,适用于需要快速发送...
微信小程序demo:todo:wx.setStorageSync(KEY,DATA) 方法存放数据(源代码+截图)微信小程序demo:todo:wx.setStorageSync(KEY,DATA) 方法存放数据(源代码+截图)微信小程序demo:todo:wx.setStorageSync(KEY,DATA) ...
golang 服务器发送事件 (sse) todo 示例这个例子的灵感来自和 。 它使用作为UI,使用作为存储。 它与其他 TodoMVC 示例略有不同,因为它添加了 SSE 功能来同步待办事项列表。启动并运行安装依赖安装 安装 git 和 ...
Go-astitodo 是一个基于 Golang 的工具,它的主要功能是帮助开发者解析和管理 GO 代码中的 TODO 注释。这个工具提供了库的形式,可以方便地集成到其他项目中,同时还有一个命令行界面 (CLI) 版本,使得开发者可以...
我是TaskWarrior的忠实拥护者,但是想要一个更简单,跨平台的解决方案,并且想学习Golang。 此处的大部分工作都遵循TaskWarrior的领导。 Todolist是用于命令行的简单且非常快速的任务管理器。 功能亮点: 手动...
点币Golang中一个简单而完整的区块链实现重要!!! 现在我们尚未完成所有代码。按键核心块结构新块默克尔树创世纪块交易钱包Boltdb UTXO 平衡记忆池孤儿双花工作量证明计算哈希币基奖励同行乒乓下游节点JsonRPC...
【Go-todo-app: 使用Golang构建的简单Todo应用】 Go-todo-app是一个基于Golang编程语言开发的轻量级待办事项管理应用程序。Golang,又称为Go语言,是Google推出的一种静态类型的、编译型的、并发型且具有垃圾回收...
最初打算作为测试 Golang 开发的平台,它可以形成更大应用程序的框架。 一些示范目标: CLI 标志参数传递。 CLI 通过文件或管道提交数据。 并发工作队列(这里有一个简单的文本解析器/扫描器)。 网络服务器 ...
去做 todo是一个自托管的todo网络应用程序,可让您以简单而最少的方式跟踪待办事项。 :memo:屏幕截图北方主题 德古拉主题 在下面的“预设颜色主题”部分中查看所有主题演示版还有一个公共演示实例,为: ://todo....
自述文件抽象的使用Golang + Gin Framework + JWT + Restful API + Mongodb构建简单的待办事项清单,同时使用Postman测试所有API功能。特征 1.用户/单一:发布方法 2.用户/登录:发布方法 3. users / todo_list:...
【标题】"simple-go-todo-list" 是一个基于Golang实现的简单待办事项列表(Todo List)网络服务器项目。这个项目旨在为用户提供一个轻量级的、易于部署的在线任务管理工具,用户可以通过网络接口添加、查看和管理...
Golang + Hprose ,简单地实现了几个功能 关机、重启、IP地址设置、dhcp server 配置 使用: 假设编译好的client文件是:t1024,并已添加到系统可执行路径 关机:t1024 -act=”shutdown” 重启:t1024 -act=”reboot...
一个演示 Golang Todo 列表,使用 Martini、React、Flux 需要导入以下库: github.com/jinzhu/gorm github.com/go-martini/martini github.com/codegangsta/martini-contrib/render github.com/lib/pq 该项目...
一个用Go编写的简单命令行待办事项列表。 用法 列出待办事项 $ todo list ☐ 001: Send patch to golang-dev :check_box_with_check: 002: Fix bug in vim ☐ 003: Write new blog entry 新增待办事项 $ todo add ...
yarn test 在交互式监视模式下启动测试运行程序。 有关更多信息,请参见关于的部分。yarn build 构建生产到应用程序build文件夹。 它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。 最小化构建,文件名...
bbs.cncsol.com 1。0。0。0版本 应用程序
在"todo:CLI个人助理"中,用户可以通过简单的命令来添加、查看、完成和删除待办事项。例如,用户可能只需要输入“todo add ‘购买牛奶’”就能将一个新的任务添加到任务列表中。这种交互方式减少了操作步骤,提高了...
明确的目标: 易于理解的代码库 支持Golang代码的简单集成 正确的尾部呼叫优化 卫生宏支持非目标: 快速的代码执行-如果需要提高速度,可以很容易地下拉到golang代码。 用Ghoul编写的全面的标准库实现-应该尽可能地...
logger包是一个golang实现的日志模块,有如下功能 支持日志写入文件,按时间或文件大小分割日志文件,避免少量文件过大 支持日志打印到终端 支持日志分等级打印,有调试跟踪信息警告错误致命6个等级 支持打印消息,...
在Golang中,`k8s.io/client-go`库是官方提供的用于与Kubernetes集群进行交互的客户端工具包。这个库使得开发人员能够方便地在Go应用程序中编写 Kubernetes API 客户端,实现对集群资源的创建、更新、查询和删除等...