mirror of
https://github.com/ayflying/p2p.git
synced 2026-03-04 17:29:22 +00:00
首次提交
This commit is contained in:
80
internal/cmd/cmd.go
Normal file
80
internal/cmd/cmd.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
"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)
|
||||
if err != nil {
|
||||
g.Log().Error(gctx.GetInitCtx(), err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
Main = gcmd.Command{
|
||||
Name: "main",
|
||||
Usage: "main",
|
||||
Brief: "start http server",
|
||||
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
|
||||
|
||||
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 := g.Server()
|
||||
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(ctx, 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
|
||||
},
|
||||
}
|
||||
)
|
||||
63
internal/cmd/debug.go
Normal file
63
internal/cmd/debug.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/dop251/goja"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gcmd"
|
||||
)
|
||||
|
||||
type DebugType struct {
|
||||
Action string `json:"action" dc:"操作渠道"`
|
||||
Number int64 `json:"number" dc:"数字"`
|
||||
String string `json:"string" dc:"字符串"`
|
||||
Json string `json:"json" dc:"符合参数"`
|
||||
}
|
||||
|
||||
var (
|
||||
Debug = gcmd.Command{
|
||||
Name: "debug",
|
||||
Usage: "debug",
|
||||
Brief: "调试接口",
|
||||
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
|
||||
g.Log().SetConfigWithMap(g.Map{
|
||||
"level": "all",
|
||||
"stdout": true,
|
||||
})
|
||||
var req = &DebugType{
|
||||
Action: parser.GetOpt("a").String(),
|
||||
Number: parser.GetOpt("n").Int64(),
|
||||
String: parser.GetOpt("s").String(),
|
||||
Json: parser.GetOpt("j").String(),
|
||||
}
|
||||
|
||||
g.Log().Debug(ctx, "开始调试了")
|
||||
g.Log().Debugf(ctx, "开始执行:action:%v,number=%v,string=%v,json=%v", req.Action, req.Number, req.String, req.Json)
|
||||
var msg any
|
||||
switch req.Action {
|
||||
case "js":
|
||||
vm := goja.New()
|
||||
|
||||
if req.String == "" {
|
||||
req.String = "console.log('hello world');"
|
||||
}
|
||||
|
||||
res, err := vm.RunString(req.String)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
msg = res.Export()
|
||||
g.Dump(res.ToNumber())
|
||||
case "p2p":
|
||||
// host, err := service.P2P().Start(ctx)
|
||||
// if err != nil {
|
||||
// break
|
||||
// }
|
||||
// g.Dump(host.ID().String(), host.Addrs())
|
||||
}
|
||||
g.Log().Debug(ctx, msg)
|
||||
return
|
||||
},
|
||||
}
|
||||
)
|
||||
89
internal/cmd/p2p.go
Normal file
89
internal/cmd/p2p.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"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"
|
||||
)
|
||||
|
||||
// p2pHelpDescription 定义P2P命令的详细帮助信息
|
||||
const p2pHelpDescription = `
|
||||
P2P连接工具使用帮助:
|
||||
|
||||
模式1: 网关服务器
|
||||
功能: 拥有外网IP,接收客户端连接,协助P2P打洞
|
||||
命令: p2p -a gateway
|
||||
|
||||
模式2: 客户端
|
||||
功能: 连接到网关,通过打洞实现与其他客户端的长连接通讯
|
||||
命令: p2p -a client --gateway 网关ID
|
||||
|
||||
高级功能:
|
||||
客户端间连接: p2p --mode client --gateway 网关ID --action connect --target 目标客户端ID
|
||||
发送消息: p2p -mode client --gateway 网关ID --action send --target 目标客户端ID --message "消息内容"
|
||||
`
|
||||
|
||||
var (
|
||||
// P2p 命令定义了P2P连接工具的入口命令
|
||||
// 遵循GoFrame的Command对象定义规范,包含名称、用法、简短描述和执行函数
|
||||
P2p = gcmd.Command{
|
||||
// Name 为命令名称
|
||||
Name: "p2p",
|
||||
// Usage 描述命令的基本用法
|
||||
Usage: "p2p [options]",
|
||||
// Brief 提供命令的简短功能描述
|
||||
Brief: "P2P连接工具,支持网关和客户端模式,实现NAT穿透和点对点通信",
|
||||
// Description 提供命令的详细描述和使用帮助
|
||||
Description: p2pHelpDescription,
|
||||
// Func 为命令的执行函数,接收上下文和参数解析器
|
||||
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
|
||||
s := g.Server()
|
||||
|
||||
// 配置日志输出
|
||||
g.Log().SetConfigWithMap(g.Map{
|
||||
"level": "all",
|
||||
"stdout": true,
|
||||
})
|
||||
|
||||
parser, err = gcmd.Parse(g.MapStrBool{
|
||||
"m,mode": true,
|
||||
"g,gateway": true,
|
||||
"a,action": true,
|
||||
"t,target": true,
|
||||
"m,message": true,
|
||||
})
|
||||
|
||||
// 获取运行模式参数
|
||||
mode := parser.GetOpt("mode").String()
|
||||
|
||||
// 根据不同模式调用服务层对应的方法
|
||||
switch mode {
|
||||
case "gateway":
|
||||
// 启动网关服务器模式
|
||||
g.Log().Debug(ctx, "开始执行gatway")
|
||||
s.Group("/ws", func(group *ghttp.RouterGroup) {
|
||||
group.Middleware(ghttp.MiddlewareHandlerResponse)
|
||||
service.P2P().GatewayStart(ctx, group)
|
||||
})
|
||||
s.Run()
|
||||
case "client":
|
||||
// 获取客户端模式所需的参数
|
||||
g.Log().Debug(ctx, "开始执行client")
|
||||
//addrs := []string{"/ip4/127.0.0.1/tcp/51888", "/ip4/192.168.50.173/tcp/51888"}
|
||||
//addr := "/ip4/192.168.50.173/tcp/51888/p2p/12D3KooWJKBB9bF9MjqgsFYUUsPBG249FDq7a3ZdaYc9iw8G78JQ"
|
||||
//addrs := "WyIvaXA0LzEyNy4wLjAuMS90Y3AvNTE4ODgiLCIvaXA0LzE5Mi4xNjguNTAuMTczL3RjcC81MTg4OCJd"
|
||||
wsStr := "ws://192.168.50.173:51888/ws"
|
||||
err = service.P2P().Start(ctx, wsStr)
|
||||
|
||||
default:
|
||||
// 显示帮助信息
|
||||
g.Log().Info(ctx, p2pHelpDescription)
|
||||
}
|
||||
|
||||
return
|
||||
},
|
||||
}
|
||||
)
|
||||
Reference in New Issue
Block a user