2021-06-13
来源:华纳网
责任编辑:王双双
人气:
核心提示:【谷雨课堂】Go实战 No.022 Go干货!轻松使用UDP
知识点:
轻松使用UDP
本课内容:
大家好,欢迎来到谷雨课堂,
上一节,我们用Go实现了一个TCP的服务端,
本节我们来实现UDP。
UDP也是非常重要的一个协议,
UDP是一个无状态的协议,
也就是说发送数据包之后,
发送者不知道发送的数据有没有送达,
这里存在接收的不确定性,
但是,这也极大的增加了发送的效率
UDP和TCP各有优势,
不同的使用场景可以混合使用
以下就是实现的基本代码
服务端
package main
import (
"fmt"
"net"
"os"
"strings"
)
func main() {
fmt.Println("启动UDP Server")
addr, err := net.ResolveUDPAddr("udp", "0.0.0.0:9009")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(addr)
conn, err := net.ListenUDP("udp", addr)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer conn.Close()
for {
data := make([]byte, 32)
_, rAddr, err := conn.ReadFromUDP(data)
if err != nil {
fmt.Println(err)
continue
}
strData := string(data)
fmt.Println("Received:", strData)
upper := strings.ToUpper(strData)
_, err = conn.WriteToUDP([]byte(upper), rAddr)
if err != nil {
fmt.Println(err)
continue
}
fmt.Println("Send:", upper)
}
}
客户端
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
//发起一个UDP请求
//这里使用的是本机127.0.0.1
//如果需要以广播的形式,可以写255.255.255.255
conn, _ := net.Dial("udp", "127.0.0.1:9009")
defer conn.Close()
input := bufio.NewScanner(os.Stdin)
//接收键盘输入
for input.Scan() {
//读取一行文字,用于发送
line := input.Text()
//发送UDP
conn.Write([]byte(line))
fmt.Println("Write:", line)
msg := make([]byte, 32)
//接收
conn.Read(msg)
fmt.Println("Response:", string(msg))
}
}
扩展阅读
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 [1] 是UDP的正式规范。
UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
许多应用只支持UDP,如:多媒体数据流,不产生任何额外的数据,即使知道有破坏的包也不进行重发。当强调传输性能而不是传输的完整性时,如:音频和多媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择。
完整的源代码可以登录【华纳网】下载。
https://www.worldwarner.com/
免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
轻松使用UDP
本课内容:
大家好,欢迎来到谷雨课堂,
上一节,我们用Go实现了一个TCP的服务端,
本节我们来实现UDP。
UDP也是非常重要的一个协议,
UDP是一个无状态的协议,
也就是说发送数据包之后,
发送者不知道发送的数据有没有送达,
这里存在接收的不确定性,
但是,这也极大的增加了发送的效率
UDP和TCP各有优势,
不同的使用场景可以混合使用
以下就是实现的基本代码
服务端
package main
import (
"fmt"
"net"
"os"
"strings"
)
func main() {
fmt.Println("启动UDP Server")
addr, err := net.ResolveUDPAddr("udp", "0.0.0.0:9009")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(addr)
conn, err := net.ListenUDP("udp", addr)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer conn.Close()
for {
data := make([]byte, 32)
_, rAddr, err := conn.ReadFromUDP(data)
if err != nil {
fmt.Println(err)
continue
}
strData := string(data)
fmt.Println("Received:", strData)
upper := strings.ToUpper(strData)
_, err = conn.WriteToUDP([]byte(upper), rAddr)
if err != nil {
fmt.Println(err)
continue
}
fmt.Println("Send:", upper)
}
}
客户端
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
//发起一个UDP请求
//这里使用的是本机127.0.0.1
//如果需要以广播的形式,可以写255.255.255.255
conn, _ := net.Dial("udp", "127.0.0.1:9009")
defer conn.Close()
input := bufio.NewScanner(os.Stdin)
//接收键盘输入
for input.Scan() {
//读取一行文字,用于发送
line := input.Text()
//发送UDP
conn.Write([]byte(line))
fmt.Println("Write:", line)
msg := make([]byte, 32)
//接收
conn.Read(msg)
fmt.Println("Response:", string(msg))
}
}
扩展阅读
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 [1] 是UDP的正式规范。
UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
许多应用只支持UDP,如:多媒体数据流,不产生任何额外的数据,即使知道有破坏的包也不进行重发。当强调传输性能而不是传输的完整性时,如:音频和多媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择。
完整的源代码可以登录【华纳网】下载。
https://www.worldwarner.com/
免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。