golang golibp2p 中继连接示例教程

golibp2p 中继连接示例教程,包含中继服务与客户端关键代码。

golibp2p手把手 接入中继教程


第一步 创建中继服务器


关键代码

host, err := libp2p.New(
        libp2p.Identity(prvKey),
        libp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/"+*port, "/ip4/0.0.0.0/udp/"+*port+"/quic-v1"),
        libp2p.ConnectionManager(connmang),
        libp2p.ForceReachabilityPublic(), // 设定公共可到达节点
        libp2p.EnableAutoNATv2(),
        libp2p.EnableNATService(),
        libp2p.AutoNATServiceRateLimit(500, 10, time.Minute),
)
//手动开启relay
_, err = relay.New(host, relay.WithLimit(&relay.RelayLimit{
        Duration: time.Minute * 3,
        Data:     1024 * 1024 * 10, //单位 kb 10Mb限制
    }))
    if err != nil {
        log.Printf("Failed to open the relay: %v", err)
        return
    }


第二部 准备两台客户端电脑


客户端都在NAT 后测试


客户端关键代码


//创建本地节点
host, err := libp2p.New()
//预定relay插槽
    relayInfo, err := client.Reserve(context.Background(), host, replyPeerInfo)
    if err != nil {
        log.Printf("预定 中继插槽失败 %v", err)
    } else {
        host.Network().Listen(relayInfo.Addrs...)
    }
//通过kdht 查找peer
...
//启动中继连接 尝试
relayPeer, _ := peer.AddrInfoFromP2pAddr(app.Fconfig.BootstrapPeers[0])
relayaddr, err := multiaddr.NewMultiaddr("/p2p/" + relayPeer.ID.String() + "/p2p-circuit/p2p/" + apeer.ID.String())
host.Network().(*swarm.Swarm).Backoff().Clear(apeer.ID) 
unreachPeerWithRelay := peer.AddrInfo{
                ID:    apeer.ID,
                Addrs: []multiaddr.Multiaddr{relayaddr},
            }
host.Connect(context.Background(), unreachPeerWithRelay);


© GVGNN 2013-2026