golang udp编程

介绍

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

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

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

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

注意

1 在接收udp包时,如果接收包时给定的buffer太小的话,就要自己解决粘包问题。
2 udp包的发送和接收不保证一定成功,不保证按正确顺序抵达。
3 如果不允许丢包的情况出现的话,要有重发机制来保证,如:反馈机制确认。

示例

服务端

package main

import (
    "fmt"
    "net"
    "strings"
)

// 读取消息
func handleConnection(udpConn *net.UDPConn) {

    // 读取数据
    buf := make([]byte, 1024)
    len, udpAddr, err := udpConn.ReadFromUDP(buf)
    if err != nil{
        return
    }
    logContent := strings.Replace(string(buf),"\n","",1)
    fmt.Println("server read len:", len)
    fmt.Println("server read data:", logContent)

    // 发送数据
    len, err = udpConn.WriteToUDP([]byte("ok\r\n"), udpAddr)
    if err != nil{
        return
    }

    fmt.Println("server write len:", len,"\n")
}

// udp 服务端
func main() {
    /*
        network: "udp"、"udp4"或"udp6"
        addr: "host:port"或"[ipv6-host%zone]:port"
    */
    udpAddr, _ := net.ResolveUDPAddr("udp4", "127.0.0.1:9998")

    //监听端口
    udpConn, err := net.ListenUDP("udp", udpAddr)
    if err != nil {
        fmt.Println(err)
    }
    defer udpConn.Close()

    fmt.Println("udp listening ... ")

    //udp不需要Accept
    for {
        handleConnection(udpConn)
    }
}

客户端

package main

import (
    "fmt"
    "net"
    "os"
)

func main() {

    udpAddr, _ := net.ResolveUDPAddr("udp4", "127.0.0.1:9998")

    //连接udpAddr,返回 udpConn
    udpConn, err := net.DialUDP("udp", nil, udpAddr)
    if err != nil {
        fmt.Println(err)
        os.Exit(2)
    }
    fmt.Println("udp dial ok ")

    // 发送数据
    len, err := udpConn.Write([]byte("上报日志文件:xxxxxx\r\n"))
    if err != nil{
        return
    }
    fmt.Println("client write len:", len)

    //读取数据
    buf := make([]byte, 1024)
    len, _ = udpConn.Read(buf)
    fmt.Println("client read len:", len)
    fmt.Println("client read data:", string(buf))

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转自原文:TCP、UDP以及TCP滑窗,它们的区别注:文中提到TCP传输过程的特点,以及“粘包”的原因和解决方案,...
    半岛夏天阅读 8,952评论 2 31
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 10,494评论 0 8
  • 网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运...
    go以恒阅读 6,481评论 0 6
  • 运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是...
    srtianxia阅读 7,445评论 0 2
  • 前言 相信计算机专业的朋友在大学都学过《计算机网络》这门课程,但据我个人了解计算机专业普通大学生对计算机网络的了解...
    zskingking阅读 8,639评论 5 23

友情链接更多精彩内容