go语言udp高并发,go高并发解决方案

go语言到底有什么好处

1. 部署简单

成都创新互联成立以来不断整合自身及行业资源、不断突破观念以使企业策略得到完善和成熟,建立了一套“以技术为基点,以客户需求中心、市场为导向”的快速反应体系。对公司的主营项目,如中高端企业网站企划 / 设计、行业 / 企业门户设计推广、行业门户平台运营、app开发定制成都手机网站制作、微信网站制作、软件开发、服务器托管等实行标准化操作,让客户可以直观的预知到从成都创新互联可以获得的服务效果。

Go

编译生成的是一个静态可执行文件,除了glibc外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。

2. 并发性好

Goroutine和channel使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个CPU核,并行执行的性能好。

3. 良好的语言设计

从学术的角度讲Go语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是

Go 自带完善的工具链,大大提高了团队协作的一致性。

4. 执行性能好

虽然不如 C 和 Java,但相比于其他编程语言,其执行性能还是很好的,适合编写一些瓶颈业务,内存占用也非常省。

Go语言能在中国这么火是因为什么?

go语言之所以能成为我国最火的语言,是因为编写服务端高并发程序的优势。我大中华区但凡pv,日活高点的网站,应用,谁没点这个需求。这个领域中最优的几个:golang,erlang,rust。日常生活中人类社交是当今社会上的必然性,人们也伴随着科技时代的发展,智能电子产品的使用中也必然少不了语言输入,文字的编辑,语言转换的便利都均可来源于go语音输入法。

国内大学本科教育,哪个学校不以c/c++为入门教学语言。都十几年了,谭浩强还在大卖。语法相近的语言总是学习和使用成本最低的。这一点非常重要。coursera上有一门程序设计语言理论课上,开篇就阐述了这一点的重要性。假设go的入门成本是一个月,erlang的入门成本是2个月,那么整个程序员群体在学习后者的付出成本就很可观了。

google由于众所周知的原因,在国内程序员中不一般的地位。golang有个好背景。

go语言之前一直都没有接受待见,如今广大的群众开始接待,因为腾讯服务器段代码编译是支持go语言的

go语言会成为主流也是一个问题,

多虑了,没有竞争来关系。

虽然go成为源了世界上最并发的语言,这并不妨碍php成为世界上最好的语言,

也不妨碍java成为世界上最有模式的语言,

更不会妨碍c++成为21天就能学会了的语言。为什么Go语言如此不受待见

其实并没有不受待见,用的人还是很多的,解决一些特定领域的问题也很方便。

每种语言的流行程度主要取决于这个语言最著名的killerapp的流行程度,C有Linux,Go有Docker。

Go 语言自我提升 (三次握手 - 四次挥手 - TCP状态图 - udp - 网络文件传输)

三次握手:

1. 主动发起连接请求端(客户端),发送 SYN 标志位,携带数据包、包号

2. 被动接收连接请求端(服务器),接收 SYN,回复 ACK,携带应答序列号。同时,发送SYN标志位,携带数据包、包号

3. 主动发起连接请求端(客户端),接收SYN 标志位,回复 ACK。

被动端(服务器)接收 ACK —— 标志着 三次握手建立完成( Accept()/Dial() 返回 )

四次挥手:

1. 主动请求断开连接端(客户端), 发送 FIN标志,携带数据包

2. 被动接受断开连接端(服务器), 发送 ACK标志,携带应答序列号。 —— 半关闭完成。

3. 被动接受断开连接端(服务器), 发送 FIN标志,携带数据包

4. 主动请求断开连接端(客户端), 发送 最后一个 ACK标志,携带应答序列号。—— 发送完成,客户端不会直接退出,等 2MSL时长。

等 2MSL待目的:确保服务器 收到最后一个ACK

滑动窗口:

通知对端本地存储数据的 缓冲区容量。—— write 函数在对端 缓冲区满时,有可能阻塞。

TCP状态转换:

1. 主动发起连接请求端:

CLOSED —— 发送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回发 ACK —— ESTABLISHED (数据通信)

2. 主动关闭连接请求端:

ESTABLISHED —— 发送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半关闭、主动端)

—— 接收FIN、回复ACK —— TIME_WAIT (主动端) —— 等 2MSL 时长 —— CLOSED

3. 被动建立连接请求端:

CLOSED —— LISTEN —— 接收SYN、发送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (数据通信)

4. 被动断开连接请求端:

ESTABLISHED —— 接收 FIN、发送 ACK —— CLOSE_WAIT —— 发送 FIN —— LAST_ACK —— 接收ACK —— CLOSED

windows下查看TCP状态转换:

netstat -an | findstr  端口号

Linux下查看TCP状态转换:

netstat -an | grep  端口号

TCP和UDP对比: 

TCP: 面向连接的可靠的数据包传递。 针对不稳定的 网络层,完全弥补。ACK

UDP:无连接不可靠的报文传输。 针对不稳定的 网络层,完全不弥补。还原网络真实状态。

优点                                                             缺点

TCP: 可靠、顺序、稳定                                      系统资源消耗大,程序实现繁复、速度慢

UDP:系统资源消耗小,程序实现简单、速度快                          不可靠、无序、不稳定

使用场景:

TCP:大文件、可靠数据传输。 对数据的 稳定性、准确性、一致性要求较高的场合。

UDP:应用于对数据时效性要求较高的场合。 网络直播、电话会议、视频直播、网络游戏。

UDP-CS-Server实现流程:

1.  创建 udp地址结构 ResolveUDPAddr(“协议”, “IP:port”) —— udpAddr 本质 struct{IP、port}

2.  创建用于 数据通信的 socket ListenUDP(“协议”, udpAddr ) —— udpConn (socket)

3.  从客户端读取数据,获取对端的地址 udpConn.ReadFromUDP() —— 返回:n,clientAddr, err

4.  发送数据包给 客户端 udpConn.WriteToUDP("数据", clientAddr)

UDP-CS-Client实现流程:

1.  创建用于通信的 socket。 net.Dial("udp", "服务器IP:port") —— udpConn (socket)

2.  以后流程参见 TCP客户端实现源码。

UDPserver默认就支持并发!

------------------------------------

命令行参数: 在main函数启动时,向整个程序传参。 【重点】

语法: go run xxx.go   argv1 argv2  argv3  argv4 。。。

xxx.exe:  第 0 个参数。

argv1 :第 1 个参数。

argv2 :第 2 个参数。

argv3 :第 3 个参数。

argv4 :第 4 个参数。

使用: list := os.Args  提取所有命令行参数。

获取文件属性函数:

os.stat(文件访问绝对路径) —— fileInfo 接口

fileInfo 包含 两个接口。

Name() 获取文件名。 不带访问路径

Size() 获取文件大小。

网络文件传输 —— 发送端(客户端)

1.  获取命令行参数,得到文件名(带路径)filePath list := os.Args

2.  使用 os.stat() 获取 文件名(不带路径)fileName

3.  创建 用于数据传输的 socket  net.Dial("tcp", “服务器IP+port”) —— conn

4.  发送文件名(不带路径)  给接收端, conn.write()

5.  读取 接收端回发“ok”,判断无误。封装函数 sendFile(filePath, conn) 发送文件内容

6.  实现 sendFile(filePath,  conn)

1) 只读打开文件 os.Open(filePath)

for {

2) 从文件中读数据  f.Read(buf)

3) 将读到的数据写到socket中  conn.write(buf[:n])

4)判断读取文件的 结尾。 io.EOF. 跳出循环

}

网络文件传输 —— 接收端(服务器)

1. 创建用于监听的 socket net.Listen() —— listener

2. 借助listener 创建用于 通信的 socket listener.Accpet()  —— conn

3. 读取 conn.read() 发送端的 文件名, 保存至本地。

4. 回发 “ok”应答 发送端。

5. 封装函数,接收文件内容 recvFile(文件路径)

1) f = os.Create(带有路径的文件名)

for {

2)从 socket中读取发送端发送的 文件内容 。 conn.read(buf)

3)  将读到的数据 保存至本地文件 f.Write(buf[:n])

4)  判断 读取conn 结束, 代表文件传输完成。 n == 0  break

}

golang udp编程

用户数据报协议(User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报(package-oriented)的传输层协议,正式规范为RFC 768。

UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。

UDP在IP数据报的头部仅仅加入了复用和数据校验。

由于缺乏可靠性且属于非连接导向协议,UDP应用一般必须允许一定量的丢包、出错和复制粘贴。

1 在接收udp包时,如果接收包时给定的buffer太小的话,就要自己解决粘包问题。

2 udp包的发送和接收不保证一定成功,不保证按正确顺序抵达。

3 如果不允许丢包的情况出现的话,要有重发机制来保证,如:反馈机制确认。

服务端

客户端


分享标题:go语言udp高并发,go高并发解决方案
本文URL:http://scyanting.com/article/dsioejh.html