在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网络,节点之间可以互相通信。