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/



                                                                                                                                                                                       







免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。