golang网络编程-UDP编程

UDP编程

1.1.1. Go语言实现UDP通信

UDP协议

UDP协议(User Datagram Protocol)中文名称是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。

UDP服务端

使用Go语言的net包实现的UDP服务端代码如下:

// UDP/server/main.go

// UDP server端
func main() {
    listen, err := net.ListenUDP("udp", &net.UDPAddr{
        IP:   net.IPv4(0, 0, 0, 0),
        Port: 30000,
    })
    if err != nil {
        fmt.Println("listen failed, err:", err)
        return
    }
    defer listen.Close()
    for {
        var data [1024]byte
        n, addr, err := listen.ReadFromUDP(data[:]) // 接收数据
        if err != nil {
            fmt.Println("read udp failed, err:", err)
            continue
        }
        fmt.Printf("data:%v addr:%v count:%v\n", string(data[:n]), addr, n)
        _, err = listen.WriteToUDP(data[:n], addr) // 发送数据
        if err != nil {
            fmt.Println("write to udp failed, err:", err)
            continue
        }
    }
}
UDP客户端

使用Go语言的net包实现的UDP客户端代码如下:

// UDP 客户端
func main() {
    socket, err := net.DialUDP("udp", nil, &net.UDPAddr{
        IP:   net.IPv4(0, 0, 0, 0),
        Port: 30000,
    })
    if err != nil {
        fmt.Println("连接服务端失败,err:", err)
        return
    }
    defer socket.Close()
    sendData := []byte("Hello server")
    _, err = socket.Write(sendData) // 发送数据
    if err != nil {
        fmt.Println("发送数据失败,err:", err)
        return
    }
    data := make([]byte, 4096)
    n, remoteAddr, err := socket.ReadFromUDP(data) // 接收数据
    if err != nil {
        fmt.Println("接收数据失败,err:", err)
        return
    }
    fmt.Printf("recv:%v addr:%v count:%v\n", string(data[:n]), remoteAddr, n)
}
Go语言(Golang)的网络编程是针对大规模后端服务程序设计的,网络通信在服务端程序中是不可或缺且至关重要的一部分。Go语言提供了两种主要的网络编程方式,即TCP socket编程和HTTP编程。 在TCP socket编程中,Go语言的net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket等。通过使用net包,可以方便地进行网络数据的传输和接收。在网络编程中,使用net.Listen函数可以返回一个在指定网络地址上监听的Listener,然后使用Accept函数等待客户端的连接请求,并创建一个新的goroutine来处理每个连接。同时,使用net.Conn接口可以进行数据的发送和接收。 下面是一个简单的示例代码,展示了如何使用Go语言进行TCP socket编程: ```go package main import ( "fmt" "net" ) func process(conn net.Conn) { defer conn.Close() for { buf := make([]byte,1024) n, err := conn.Read(buf) if err != nil { fmt.Println("读取数据错误:", err) return } fmt.Print(string(buf[:n])) } } func main() { fmt.Println("服务器开始监听...") listen, err := net.Listen("tcp", "0.0.0.0:8888") defer listen.Close() if err != nil { fmt.Println("监听错误:", err) return } for { fmt.Println("等待客户端连接...") conn, err := listen.Accept() if err != nil { fmt.Println("接受连接错误:", err) return } else { fmt.Printf("接受到客户端连接, 客户端地址:%v\n", conn.RemoteAddr()) go process(conn) } } } ``` 以上代码实现了一个简单的服务器程序,它监听本地地址的8888端口,并在接受到客户端连接后创建一个新的goroutine来处理连接。在处理连接的goroutine中,使用conn.Read函数从连接中读取数据,然后将读取到的数据打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值