Golang中如何实现P2P通信?代码举例讲解

在Golang中,可以使用net包来实现P2P通信。代码示例:

go
// 节点
type node struct {
    conn *net.TCPConn     // 连接
    addr *net.TCPAddr     // 地址
}

// 节点列表
var nodes = make(map[string]*node)

// 监听端口
port := 8000 
listener, err := net.Listen("tcp", ":"+strconv.Itoa(port))
if err != nil {
    log.Fatal(err) 
}

// 接受连接并添加到节点列表 
for { 
    conn, err := listener.Accept() 
    if err != nil {
        log.Fatal(err)
    }

    node := &node{
        conn: conn, 
        addr: conn.RemoteAddr().(*net.TCPAddr),
    }
    nodes[node.addr.String()] = node 
}

// 与所有节点建立连接 
for _, node := range nodes {
    conn, err := net.Dial("tcp", node.addr.String()) 
    if err != nil {
        log.Fatal(err)
    }
    // ...
}   

// 节点间通信
for {
    // 选择节点conn并读取数据
    data, err := conn.Read(buf)
    if err != nil {
        // ...
    }

    // 广播数据到所有其他节点
    for _, node := range nodes {
        if node.conn != conn {
            _, err := node.conn.Write(data)
            if err != nil {
                // ... 
            }
        } 
    }
}

该程序会在指定端口监听连接,接收到的连接会存储在nodes节点列表中。它与列表中的所有节点建立连接,并在接收到数据时广播给其他节点。这实现了一个简单的P2P网络,节点之间可以互相通信。