文档章节

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

OneTODO
 OneTODO
发布于 2016/11/10 18:41
字数 562
阅读 474
收藏 0

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”, remoteaddr, 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:”, 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

qrcode_for_gh_6bb1f39ae99c_258

 

© 著作权归作者所有

OneTODO
粉丝 1
博文 63
码字总数 26450
作品 0
厦门
程序员
私信 提问
TODO:Golang语言TCP/UDP协议重用地址端口

TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题。 go net包(据我所知)不允许设置套接字选项。 这在尝试进行TCP NAT时尤其成问题,其需要在同一TCP端口上进...

OneTODO
2016/11/30
344
0
wiker/xx-net-server

xx-net-server Github:https://github.com/wikeryong/xx-net-server 说明 实现了Server监听和简单的事件处理 兼容长连接和短连接 支持同时启动多个Server(监听不同的端口) 并没有实现解析...

wiker
2017/04/14
0
0
golang net http库相关超时的设置

net.http 包中的超时设置 服务端 app.Server.ReadTimeout app.Server.WriteTimeout 是针对所有请求设置的选项 默认 net.http keepalived 开启,超时时间为 3 分钟,如下 1942 type tcpKeepA...

智深
2014/07/26
3.1K
0
PHP的异步并行网络扩展Swoole已发布1.7.5版本

PHP的异步并行网络扩展Swoole今天发布了最新的1.7.5版本。 项目主页:http://www.swoole.com/ 文档页面:http://wiki.swoole.com/ 源代码:https://github.com/swoole/swoole-src 1.7.4版本:...

matyhtf
2014/09/10
3K
31
Google的一些开源软件

代码分析 classp 语法解析器。C++。 shlex 小词法器。Shell Lexer也。Go。 streamhtmlpars 流式HTML分析器。C。 9年。 shipshap 源代码静态分析工具。Go & Java。1年。 infact 轻量级别的C++...

shengjuntu
2016/11/21
51
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
14
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部