MENU

【Go】简单实现一个udp服务器

October 19, 2022 • Golang

序言

前文推荐: 【Go】简单实现一个tcp服务器 - 五葉魔法书 (grimoire.cn)

我们在前文说明了如何使用tcp来实现一个简单的服务器,那么我们今天来说一下,如何使用udp实现一个简单的udp服务器

照例,我们先说下 udp 协议的基础:

  1. udp 协议与 tcp 同属传输层协议,也是在 ip (传输层) 之上建立的一种协议,同样是在操作系统层面就已经实现了
  2. udp 协议是无连接的,尽最大努力交付(数据可能会丢失),没有拥塞控制

在实际的使用中,udp 更多的是面向于要求高效率的场景,因为不需要建立连接,也就不需要握手,从而节省了非常多的时间,因此也常常用在 dns 等服务上(tftp,网络直播,quic),同时也正是因为 udp 不需要握手的特性,让他被 http3 的标准选中。

代码实现

服务端

在实现之前,我们还是大致说一下思路:

  1. 因为 udp 不需要面向连接,所以我们这次不需要额外的协程来单独处理,仅仅使用一个循环来读取数据即可
/*
 * @Author: NorthCity1984
 * @LastEditTime: 2022-10-19 22:34:48
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCity1984 All rights reserved.
 */

package main

import (
    "fmt"
    "log"
    "net"
)

func main() {
    // 启动一个 udp 服务
    listen, err := net.ListenUDP("udp", &net.UDPAddr{Port: 3000})
    if err != nil {
        log.Fatalln(err)
    }
    defer listen.Close()

    buffer := make([]byte, 256)

    for {
        // 循环读取数据
        n, addr, err := listen.ReadFromUDP(buffer)
        if err != nil {
            log.Println(err)
            return
        }
        fmt.Println("addr: ", addr, "message: ", string(buffer[:n]))
    }
}

客户端

客户端的思路我们还是参照下前面 tcp 的客户端,基本结构都大差不差的

/*
 * @Author: NorthCity1984
 * @LastEditTime: 2022-10-19 22:34:31
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCity1984 All rights reserved.
 */


package main

import (
    "fmt"
    "log"
    "net"
)

func main() {
    listen, err := net.DialUDP("udp", nil, &net.UDPAddr{Port: 3000})
    if err != nil {
        log.Fatalln(err)
    }
    defer listen.Close()

    for {
        var input string
        fmt.Scan(&input)
        _, err := listen.Write([]byte(input))
        if err != nil {
            log.Println(err)
            break
        }
    }
}
作者:NorthCity1984
出处:https://grimoire.cn/golang/go-udp.html
版权:本文《【Go】简单实现一个udp服务器》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任