GO语言初级学习之代码案例12 (UDP通信)

@(go语言 黑马)[GO语言]

UDP通信

  • 题目:编写UDP通信的并发服务器和客户端
  • 知识点:UDP通信
  • 逻辑思路(详细的步骤在代码注释中):

_1. 发送端 将文件名发送给 接收端
_2. 接收端 收到文件名后,发送 "ok" 信号给 发送端
_3. 发送端 收到 "ok" 信号后,开始传输文件内容给 接收端
_4. 接收端 接收并保存文件内容

服务器代码如下:

package main

import "fmt"

func main() {
    UdpCommunication()
}

//UDP服务器
func UdpCommunication() {
    //建立UDP客戶端连接,注意:返回的是服务器地址,不再是listener,不需要监听
    clientAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8002")
    if err != nil {
        fmt.Println("net.ResolveUDPAddr err:", err)
        return
    }
    fmt.Println("clientAddr",clientAddr)

    //建立通信socket,使用服务器地址建立
    conn, err := net.ListenUDP("udp", clientAddr)
    if err != nil {
        fmt.Println("net.ListenUDP err:", err)
        return
    }
    defer conn.Close()

    buf := make([]byte, 4096)
    for {//循环处理客户端数据
        n, UdpAddr, err := conn.ReadFromUDP(buf)//返回值多了一个客户端地址
        //fmt.Println("UdpAddr:",UdpAddr)//打印客户端地址
        if err != nil {
            fmt.Println("conn.ReadFromUDP err:", err)
            return
        }
        fmt.Println("读到客户端数据:", string(buf[:n]))

        timeNow := time.Now().String()//现在时间
        conn.WriteToUDP([]byte(timeNow), UdpAddr)
    }
}

客户端代码如下:

package main

import "fmt"

func main() {
    Client()
}
func Client() {
    conn, err := net.Dial("udp", "127.0.0.1:8002")//与服务器建立连接,协议必须小写
    if err != nil {
        fmt.Println("net.Dial err:", err)
        return
    }
    defer conn.Close()//不要忘记关闭

    for {//循环发送请求
        requst := make([]byte, 4096)
        n, err := os.Stdin.Read(requst)
        //os.Stdin是标准输入,返回的是一个文件指针,所以后面直接可以读取数据到缓冲切片中
        if err != nil {
            fmt.Println("os.Stdin.Read err:", err)
            return
        }

        conn.Write(requst[:n])

        buf := make([]byte, 4096)
        n, err = conn.Read(buf)
        if err != nil {
            fmt.Println("conn.Read err:", err)
            return
        }
        fmt.Println("读到客户端回发数据:", string(buf[:n]))
    }
}

你可能感兴趣的:(GO语言初级学习之代码案例12 (UDP通信))