mirror of
https://github.com/ayflying/p2p.git
synced 2026-03-04 17:29:22 +00:00
dht方法不太可控,切换为ws方案,增加上传模块
This commit is contained in:
@@ -2,17 +2,19 @@ package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/ayflying/p2p/internal/controller/p2p"
|
||||
"github.com/ayflying/p2p/internal/service"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/net/ghttp"
|
||||
"github.com/gogf/gf/v2/os/gcmd"
|
||||
"github.com/gogf/gf/v2/os/gctx"
|
||||
"github.com/gogf/gf/v2/os/gtimer"
|
||||
)
|
||||
|
||||
func init() {
|
||||
err := Main.AddCommand(&Main, &Debug, &P2p, &DHT)
|
||||
err := Main.AddCommand(&Main, &Debug, &Update)
|
||||
if err != nil {
|
||||
g.Log().Error(gctx.GetInitCtx(), err)
|
||||
return
|
||||
@@ -32,66 +34,50 @@ var (
|
||||
parser, err = gcmd.Parse(g.MapStrBool{
|
||||
"p,port": true,
|
||||
})
|
||||
port := parser.GetOpt("port", "23333").Int()
|
||||
//port := parser.GetOpt("port", "23333").Int()
|
||||
|
||||
h, _ := service.P2P().CreateLibp2pHost(gctx.New(), port)
|
||||
err = service.P2P().DHTStart(h, nil)
|
||||
if err != nil {
|
||||
g.Log().Error(ctx, err)
|
||||
}
|
||||
parser, err = gcmd.Parse(g.MapStrBool{
|
||||
"w,ws": true,
|
||||
"g,gateway": true,
|
||||
"p,port": true,
|
||||
})
|
||||
addr := g.Cfg().MustGet(ctx, "ws.address").String()
|
||||
ws := parser.GetOpt("ws", addr).String()
|
||||
//port := parser.GetOpt("port", 0).Int()
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
publicIp, _ := service.P2P().GetIPv4PublicIP()
|
||||
validKey := fmt.Sprintf("%v/ip", h.ID())
|
||||
dataValue := fmt.Sprintf("来自节点 %s 的数据:%v", h.ID().ShortString(), publicIp)
|
||||
if err = service.P2P().StoreToDHT(gctx.New(), validKey, dataValue); err != nil {
|
||||
g.Log().Debugf(ctx, "❌ 存储失败: %v\n", err)
|
||||
} else {
|
||||
g.Log().Debugf(ctx, "✅ 存储成功\nKey: %s\nValue: %s\n", validKey, dataValue)
|
||||
}
|
||||
s.Group("/", func(group *ghttp.RouterGroup) {
|
||||
group.Middleware(ghttp.MiddlewareHandlerResponse)
|
||||
group.Bind(
|
||||
p2p.NewV1(),
|
||||
)
|
||||
})
|
||||
|
||||
//parser, err = gcmd.Parse(g.MapStrBool{
|
||||
// "w,ws": true,
|
||||
// "g,gateway": true,
|
||||
// "p,port": true,
|
||||
//})
|
||||
//addr := g.Cfg().MustGet(ctx, "ws.address").String()
|
||||
//ws := parser.GetOpt("ws", addr).String()
|
||||
////port := parser.GetOpt("port", 0).Int()
|
||||
//
|
||||
//s.Group("/", func(group *ghttp.RouterGroup) {
|
||||
// group.Middleware(ghttp.MiddlewareHandlerResponse)
|
||||
// group.Bind(
|
||||
// p2p.NewV1(),
|
||||
// )
|
||||
//})
|
||||
//
|
||||
////启动p2p服务端网关
|
||||
//s.Group("/ws", func(group *ghttp.RouterGroup) {
|
||||
// group.Middleware(ghttp.MiddlewareHandlerResponse)
|
||||
// err = service.P2P().GatewayStart(ctx, group)
|
||||
// if err != nil {
|
||||
// g.Log().Error(ctx, err)
|
||||
// }
|
||||
//})
|
||||
//
|
||||
////s.SetPort(port)
|
||||
//
|
||||
//// 延迟启动
|
||||
//gtimer.SetTimeout(ctx, time.Second*5, func(ctx context.Context) {
|
||||
// g.Log().Debug(ctx, "开始执行客户端")
|
||||
// // 启动p2p客户端
|
||||
// err = service.P2P().Start(ws)
|
||||
//
|
||||
// g.Log().Debugf(ctx, "当前监听端口:%v", s.GetListenedPort())
|
||||
// //addrs, _ := net.InterfaceAddrs()
|
||||
// //for _, addr := range addrs {
|
||||
// // if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
|
||||
// // g.Log().Infof(ctx, "访问地址:http://%v:%d", ipnet.IP.String(), s.GetListenedPort())
|
||||
// // }
|
||||
// //}
|
||||
//
|
||||
//})
|
||||
//启动p2p服务端网关
|
||||
s.Group("/ws", func(group *ghttp.RouterGroup) {
|
||||
group.Middleware(ghttp.MiddlewareHandlerResponse)
|
||||
err = service.P2P().GatewayStart(ctx, group)
|
||||
if err != nil {
|
||||
g.Log().Error(ctx, err)
|
||||
}
|
||||
})
|
||||
|
||||
//s.SetPort(port)
|
||||
|
||||
// 延迟启动
|
||||
gtimer.SetTimeout(ctx, time.Second*5, func(ctx context.Context) {
|
||||
g.Log().Debug(ctx, "开始执行客户端")
|
||||
// 启动p2p客户端
|
||||
err = service.P2P().Start(ws)
|
||||
|
||||
g.Log().Debugf(ctx, "当前监听端口:%v", s.GetListenedPort())
|
||||
//addrs, _ := net.InterfaceAddrs()
|
||||
//for _, addr := range addrs {
|
||||
// if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
|
||||
// g.Log().Infof(ctx, "访问地址:http://%v:%d", ipnet.IP.String(), s.GetListenedPort())
|
||||
// }
|
||||
//}
|
||||
|
||||
})
|
||||
|
||||
s.Run()
|
||||
return nil
|
||||
|
||||
@@ -2,11 +2,13 @@ package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/ayflying/p2p/internal/service"
|
||||
"github.com/dop251/goja"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gcmd"
|
||||
"github.com/gogf/gf/v2/os/gfile"
|
||||
)
|
||||
|
||||
type DebugType struct {
|
||||
@@ -22,7 +24,7 @@ var (
|
||||
Usage: "debug",
|
||||
Brief: "调试接口",
|
||||
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
|
||||
g.Log().Debug(ctx, "开始执行debug")
|
||||
g.Log().Debug(ctx, "开始执行debug v1.0.5")
|
||||
|
||||
g.Log().SetConfigWithMap(g.Map{
|
||||
"level": "all",
|
||||
@@ -59,10 +61,63 @@ var (
|
||||
// }
|
||||
// g.Dump(host.ID().String(), host.Addrs())
|
||||
case "update":
|
||||
service.OS().Update("v1.0.0", "http://127.0.0.1:8080")
|
||||
url := "http://ay.cname.com:5244/d/guest/novapps/%E5%88%86%E5%B8%83%E5%BC%8F/p2p/p2p.exe?sign=8anTHvfJKJLCfZTI4IuopNK38x9rEoDiNevr5aZZPgM=:0"
|
||||
g.Log().Debugf(ctx, "当前开始更新了,url=%v", url)
|
||||
//service.OS().Update("v1.0.0", "http://127.0.0.1:8080")
|
||||
|
||||
resp, err := g.Client().Get(ctx, url)
|
||||
if err != nil {
|
||||
g.Log().Error(ctx, err)
|
||||
}
|
||||
//filename := g.Cfg("hack").MustGet(ctx, "gfcli.build.name").String()
|
||||
filename := gcmd.GetArg(0).String()
|
||||
|
||||
_, err = renameRunningFile(filename)
|
||||
if err != nil {
|
||||
g.Log().Error(ctx, err)
|
||||
}
|
||||
|
||||
//switch runtime.GOOS {
|
||||
//case "windows":
|
||||
// fmt.Println("当前系统:Windows")
|
||||
// filename = filename + ".exe"
|
||||
// if gfile.Exists(filename) {
|
||||
// filename += "~"
|
||||
// }
|
||||
//default:
|
||||
// fmt.Println("当前系统:" + runtime.GOOS)
|
||||
//}
|
||||
//if gfile.Exists(filename) {
|
||||
// filename += "~"
|
||||
//}
|
||||
err = gfile.PutBytes(filename, resp.ReadAll())
|
||||
if err != nil {
|
||||
g.Log().Error(ctx, err)
|
||||
}
|
||||
msg = "下载完成了"
|
||||
}
|
||||
g.Log().Debug(ctx, msg)
|
||||
return
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
// 重命名正在运行的程序文件(如 p2p.exe → p2p.exe~)
|
||||
func renameRunningFile(exePath string) (string, error) {
|
||||
// 目标备份文件名(p2p.exe → p2p.exe~)
|
||||
backupPath := exePath + "~"
|
||||
|
||||
// 先删除已存在的备份文件(若有)
|
||||
if _, err := os.Stat(backupPath); err == nil {
|
||||
if err := os.Remove(backupPath); err != nil {
|
||||
return "", fmt.Errorf("删除旧备份文件失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 重命名正在运行的 exe 文件
|
||||
// 关键:Windows 允许对锁定的文件执行重命名操作
|
||||
if err := os.Rename(exePath, backupPath); err != nil {
|
||||
return "", fmt.Errorf("重命名运行中文件失败: %v", err)
|
||||
}
|
||||
return backupPath, nil
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package cmd
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/ayflying/p2p/internal/service"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
@@ -41,7 +42,7 @@ var (
|
||||
Description: p2pHelpDescription,
|
||||
// Func 为命令的执行函数,接收上下文和参数解析器
|
||||
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
|
||||
g.Log().Debug(ctx, "开始执行p2p")
|
||||
g.Log().Debug(ctx, "开始执行p2p v1.0.3")
|
||||
|
||||
s := g.Server()
|
||||
|
||||
@@ -82,7 +83,20 @@ var (
|
||||
g.Log().Debug(ctx, "开始执行dht")
|
||||
h, _ := service.P2P().CreateLibp2pHost(ctx, 23333)
|
||||
|
||||
err := service.P2P().DHTStart(h, nil)
|
||||
addr := []string{
|
||||
"/ip4/192.168.50.243/tcp/23333/p2p/12D3KooWESZtrm6AfqhC3oj5FsAbcSmePwHFFip3F2MPExrxHxwy",
|
||||
"/ip4/192.168.50.243/udp/23333/quic-v1/p2p/12D3KooWESZtrm6AfqhC3oj5FsAbcSmePwHFFip3F2MPExrxHxwy",
|
||||
|
||||
//"/ip4/192.168.50.173/tcp/23333/p2p/12D3KooWKgW8WxncYzZ2h5erMbK3GfLGhNHFapPvhUc1KVmdZeRg",
|
||||
//"/ip4/192.168.50.173/udp/23333/quic-v1/p2p/12D3KooWKgW8WxncYzZ2h5erMbK3GfLGhNHFapPvhUc1KVmdZeRg",
|
||||
|
||||
//"/ip4/192.168.50.173/tcp/23333/p2p/12D3KooWQsb1137nCzqbMMCzwHsyU8aaCZeFnBUBTkWVsfp8gs26",
|
||||
//"/ip4/192.168.50.173/udp/23333/quic-v1/p2p/12D3KooWQsb1137nCzqbMMCzwHsyU8aaCZeFnBUBTkWVsfp8gs26",
|
||||
//"/ip4/114.132.176.115/tcp/23333/p2p/12D3KooWJQMiYyptqSrx4PPsGLY9hjLbaDdxmBXmGtKmSWuiP79D",
|
||||
//"/ip4/114.132.176.115/udp/23333/quic-v1/p2p/12D3KooWJQMiYyptqSrx4PPsGLY9hjLbaDdxmBXmGtKmSWuiP79D",
|
||||
}
|
||||
|
||||
err := service.P2P().DHTStart(h, addr)
|
||||
if err != nil {
|
||||
g.Log().Error(ctx, err)
|
||||
}
|
||||
@@ -95,17 +109,26 @@ var (
|
||||
} else {
|
||||
fmt.Printf("✅ 存储成功\nKey: %s\nValue: %s\n", validKey, dataValue)
|
||||
}
|
||||
|
||||
s.SetPort(0)
|
||||
case "dht2":
|
||||
g.Log().Debug(ctx, "开始执行dht2")
|
||||
h, _ := service.P2P().CreateLibp2pHost(ctx, 23333)
|
||||
|
||||
//addr := []string{
|
||||
// "/ip4/192.168.50.243/tcp/23333/p2p/12D3KooWESZtrm6AfqhC3oj5FsAbcSmePwHFFip3F2MPExrxHxwy",
|
||||
// "/ip4/192.168.50.243/udp/23333/quic-v1/p2p/12D3KooWESZtrm6AfqhC3oj5FsAbcSmePwHFFip3F2MPExrxHxwy",
|
||||
// //"/ip4/192.168.50.243/tcp/23333/p2p/12D3KooWESZtrm6AfqhC3oj5FsAbcSmePwHFFip3F2MPExrxHxwy",
|
||||
// //"/ip4/192.168.50.243/udp/23333/quic-v1/p2p/12D3KooWESZtrm6AfqhC3oj5FsAbcSmePwHFFip3F2MPExrxHxwy",
|
||||
//
|
||||
// "/ip4/192.168.50.173/tcp/23333/p2p/12D3KooWKgW8WxncYzZ2h5erMbK3GfLGhNHFapPvhUc1KVmdZeRg",
|
||||
// "/ip4/192.168.50.173/udp/23333/quic-v1/p2p/12D3KooWKgW8WxncYzZ2h5erMbK3GfLGhNHFapPvhUc1KVmdZeRg",
|
||||
// //肖晓
|
||||
// "/ip4/192.168.50.244/tcp/23333/p2p/12D3KooWFAt3hTi2SaYNty4gxxBnLRFxJidRDcf4k8HqCUZZRY1W",
|
||||
// "/ip4/192.168.50.244/udp/23333/quic-v1/p2p/12D3KooWFAt3hTi2SaYNty4gxxBnLRFxJidRDcf4k8HqCUZZRY1W",
|
||||
//
|
||||
// //廖玉龙
|
||||
// "/ip4/192.168.50.210/tcp/23333/p2p/12D3KooWM8eE3i2EWB2wFVGM1URusBPHJrEQJGxKfKgPdxEMm9hn",
|
||||
// "/ip4/192.168.50.210/udp/23333/quic-v1/p2p/12D3KooWM8eE3i2EWB2wFVGM1URusBPHJrEQJGxKfKgPdxEMm9hn",
|
||||
//
|
||||
//
|
||||
// //"/ip4/192.168.50.173/tcp/23333/p2p/12D3KooWKgW8WxncYzZ2h5erMbK3GfLGhNHFapPvhUc1KVmdZeRg",
|
||||
// //"/ip4/192.168.50.173/udp/23333/quic-v1/p2p/12D3KooWKgW8WxncYzZ2h5erMbK3GfLGhNHFapPvhUc1KVmdZeRg",
|
||||
//
|
||||
// //"/ip4/192.168.50.173/tcp/23333/p2p/12D3KooWQsb1137nCzqbMMCzwHsyU8aaCZeFnBUBTkWVsfp8gs26",
|
||||
// //"/ip4/192.168.50.173/udp/23333/quic-v1/p2p/12D3KooWQsb1137nCzqbMMCzwHsyU8aaCZeFnBUBTkWVsfp8gs26",
|
||||
@@ -113,13 +136,16 @@ var (
|
||||
// //"/ip4/114.132.176.115/udp/23333/quic-v1/p2p/12D3KooWJQMiYyptqSrx4PPsGLY9hjLbaDdxmBXmGtKmSWuiP79D",
|
||||
//}
|
||||
|
||||
id := gcmd.GetOpt("id").String()
|
||||
err := service.P2P().DHTStart(h, nil)
|
||||
addrVar, err := g.Cfg().Get(ctx, "dht.addrs")
|
||||
addr := addrVar.Strings()
|
||||
|
||||
validKey := gcmd.GetOpt("id").String()
|
||||
err = service.P2P().DHTStart(h, addr)
|
||||
if err != nil {
|
||||
g.Log().Error(ctx, err)
|
||||
}
|
||||
validKey := id
|
||||
go func() {
|
||||
time.Sleep(30 * time.Second)
|
||||
// 5. 查找数据(从网络中的节点获取,不依赖初始 Bootstrap 节点)
|
||||
foundValue, err := service.P2P().FindFromDHT(ctx, validKey)
|
||||
if err != nil {
|
||||
|
||||
42
internal/cmd/update.go
Normal file
42
internal/cmd/update.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"path"
|
||||
"runtime"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gcfg"
|
||||
"github.com/gogf/gf/v2/os/gcmd"
|
||||
)
|
||||
|
||||
var (
|
||||
Update = gcmd.Command{
|
||||
Name: "update",
|
||||
Usage: "update",
|
||||
Brief: "更新版本",
|
||||
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
|
||||
g.Log().Info(ctx, "准备上传更新文件")
|
||||
//加载编辑配置文件
|
||||
g.Cfg("hack").GetAdapter().(*gcfg.AdapterFile).SetFileName("hack/config.yaml")
|
||||
//获取文件名
|
||||
getFileName, err := g.Cfg("hack").Get(ctx, "gfcli.build.name")
|
||||
filename := getFileName.String()
|
||||
|
||||
getPath, err := g.Cfg("hack").Get(ctx, "gfcli.build.path")
|
||||
pathMain := getPath.String()
|
||||
|
||||
//获取版本号
|
||||
getVersion, err := g.Cfg("hack").Get(ctx, "gfcli.build.version")
|
||||
version := getVersion.String()
|
||||
|
||||
// 拼接操作系统和架构(格式:OS_ARCH)
|
||||
platform := fmt.Sprintf("%s_%s", runtime.GOOS, runtime.GOARCH)
|
||||
|
||||
var filePath = path.Join(pathMain, version, platform, filename)
|
||||
|
||||
g.Log().Debugf(ctx, "当前获取到的地址为:%v", filePath)
|
||||
return
|
||||
}}
|
||||
)
|
||||
Reference in New Issue
Block a user