golang

【golang】实现基于UDP协议的简单的C-S架构

2019-07-25  本文已影响0人  七八个星天

与TCP相比,UDP的服务器和客户端之间不用建立持久的连接,数据传输更加高效,但稳定性和安全性较差

一、服务器

package main

import (
    "fmt"
    "net"
    "time"
)

func main() {
    //建立udp服务器结构体
    udpServer, err := net.ResolveUDPAddr("udp", "127.0.0.1:8001")
    if err != nil {
        fmt.Println("net.ResolveUDPAddr err", err)
        return
    }
    //创建udp监听服务
    conn, err := net.ListenUDP("udp", udpServer)
    defer conn.Close()
    if err != nil {
        fmt.Println("net.ListenUDP err", err)
        return
    }
    for {
        //读取客户端数据
        buf := make([]byte, 1024)
        n, udpClient, err := conn.ReadFromUDP(buf)
        if err != nil {
            fmt.Println("conn.ReadFromUDP err", err)
        }
        fmt.Printf("%s:%d发来数据:%s\n", udpClient.IP, udpClient.Port, string(buf[:n]))
        //向客户端发送当前时间
        now := time.Now().String()
        conn.WriteToUDP([]byte(now), udpClient)
    }

}

二、客户端

package main

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

func main() {
    //发送请求,获取连接
    conn, err := net.Dial("udp", "127.0.0.1:8001")
    defer conn.Close()
    if err != nil {
        fmt.Println("net.Dial err:", err)
        return
    }
    for {
        //输入数据并发送给服务器
        str := make([]byte, 4096)
        //读取键盘输入
        n, err := os.Stdin.Read(str)
        if err != nil {
            fmt.Println("os.Stdin.Read err:", err)
        }
        conn.Write(str[:n])
        if n == 0 {
            continue
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读