Golang使用kcp

发布时间 2023-12-04 11:17:41作者: 朝阳1

安装 go get -u github.com/xtaci/kcp-go

import (
    "fmt"
    "github.com/xtaci/kcp-go"
    "golang.org/x/net/ipv4"
    "golang.org/x/net/ipv6"
    "net"
)
// KCP 服务器
func server() {
    // 创建一个 UDP 连接
    udpConn, err := net.ListenUDP("udp", &net.UDPAddr{Port: 12345})
    if err != nil {
        fmt.Println("创建UDP连接失败:", err)
        return
    }

    // 创建 KCP 对象
    kcpConn, err := kcp.ServeConn(nil, 0, 0, udpConn)
    if err != nil {
        fmt.Println("创建KCP连接失败:", err)
        return
    }

    // 设置 KCP 参数
    kcpConn.SetWindowSize(4096, 4096)
    kcpConn.SetNoDelay(1, 10, 2, 1)
    kcpConn.SetStreamMode(true)

    // 进行数据传输
    data := []byte("Hello, KCP!")
    _, err = kcpConn.Write(data)
    if err != nil {
        fmt.Println("数据传输失败:", err)
        return
    }

    // 关闭连接
    kcpConn.Close()
}

// KCP 客户端
func client() {
    // 创建一个 UDP 连接
    udpConn, err := net.DialUDP("udp", nil, &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 12345})
    if err != nil {
        fmt.Println("创建UDP连接失败:", err)
        return
    }

    // 创建 KCP 对象
    kcpConn, err := kcp.Dial(udpConn.RemoteAddr().String())
    if err != nil {
        fmt.Println("创建KCP连接失败:", err)
        return
    }

    // 设置 KCP 参数
    kcpConn.SetWindowSize(4096, 4096)
    kcpConn.SetNoDelay(1, 10, 2, 1)
    kcpConn.SetStreamMode(true)

    // 接收数据
    buffer := make([]byte, 1024)
    n, err := kcpConn.Read(buffer)
    if err != nil {
        fmt.Println("接收数据失败:", err)
        return
    }

    fmt.Println("接收到的数据:", string(buffer[:n]))

    // 关闭连接
    kcpConn.Close()
}

func main() {
    go server() // 启动 KCP 服务器
    go client() // 启动 KCP 客户端

    // 等待程序退出
    select {}
}