ao-space / gt Goto Github PK
View Code? Open in Web Editor NEWFast WebSocket(s)/HTTP(s)/TCP relay proxy for making tunnels to localhost.
Home Page: https://ao.space
License: Apache License 2.0
Fast WebSocket(s)/HTTP(s)/TCP relay proxy for making tunnels to localhost.
Home Page: https://ao.space
License: Apache License 2.0
Hi :
根据文档,我尝试了下TCP 内网穿透这个示例 ,主要需求是通过ssh公网的某一个端口,访问内网, 实测一直提示ssh超时,
我的命令分别为:
./release/linux-amd64-server -addr 9527 -id id1 -secret secret1 -tcpNumber 1 -tcpRange 1024-65535
./release/linux-amd64-client -local http://127.0.0.1:22 -remote tcp://42.193.223.69:9527 -id id1 -secret secret1 -remoteTCPPort 2222
1.那这块如果不加server.yaml 默认使用127.0.0.1:8000 默认只能本机访问了吧,外网得话会无法访问,这一块希望在文档中能体现说明一下
2.希望页面端能添加修改端口得功能
3.希望页面端能添加修改域名证书得功能
4.希望页面端能添加页面多用户登录的功能,就比如我想共享给其他人使用 又不想给admin得账户 ,可以添加一个其他账户供使用
家庭宽带是上传流量小,需要上传时压缩。
I need a full HTTP Proxy over a websocket and i noticed GT is pretty similar.
The use-case here for a full proxy is you are traveling and you want to be able to watch TV from home. Sure I can use WireGuard or something like WebMesh which is a zero-config way of setting up a VPN. But... what if i want to access this VPN with a websocket?
GT will only forward to a specific host, but the HTTP Proxy protocol lets the client specify any host so that they can browse the web without censorship or being tracked. And this could work with the current GT web tunnel.
There is also the wssocks project which is Socks5 over websockets - in golang, which might be useful here?
Thoughts?
远程协作场景:
1,有一台公网服务器,可以按需部署软件,域名server.example.com已解析关联,所有人都可以通过这个地址来访问。
2,员工远程办公,假设都在做web服务开发,每个人负责不同的部分。当他们完成自己的工作后,各自都在本地发布自己的服务。
3,服务有时需要相互调用,但由于环境各异不能直接互相访问,所以希望利用服务器作为中介,帮助它们相互通信。
4,有些员工在同一个办公室,他们希望能够在不改变开发方式的条件下,服务能自动发现并直接在局域网内部相互通信,而不是完全通过服务器,以提高速度。(这是画龙点睛功能,如果太难实现就不必坚持)
5,最后,测试人员或老板想要检查工作效果,他们不安装任何软件,只需在浏览器中访问 http(s)://server.example.com 就能查看系统的运行情况。
整个就像个把复杂的网络透明化的开发协作平台,此种需求是否有可能达成?
Currently, GT can only be built and run on Linux or Linux Container.
It would be great if GT supports to be built and run on Windows.
PR for this feature from new contributor are welcome.
最好web管理页最好弄个记住密码或者免登陆xx天的功能
现有的token失效时间太短了,因为都是在服务器或私人电脑用,外网不怎么用这个管理页功能
所以弄记住密码或者免登陆xx天会很方便使用的
Currently, GT can only be built and run on Linux or Linux Container.
It would be great if GT supports to be built and run on macOS.
PR for this feature from new contributor are welcome.
hi :
我在ubuntu 上编译gt ,
报如下错误:
ya@ya-linux:~/work/gt$ make gofumpt --version || go install mvdan.cc/gofumpt@latest v0.5.0 (go1.18.1) gofumpt -l -w ./conn/conn.go ./predef/version.go ./predef/release.go ./predef/const.go ./predef/debug.go ./util/rand.go ./util/portrange.go ./util/portrange_test.go ./util/blockvalue_test.go ./util/blockvalue.go ./config/position_test.go ./config/slice_test.go ./config/positionslice_test.go ./config/slice.go ./config/config.go ./config/config_test.go ./config/positionslice.go ./config/position.go ./logger/logger.go ./cmd/server/main.go ./cmd/client/main.go ./server/user_test.go ./server/tls_test.go ./server/sync/map_test.go ./server/sync/create.go ./server/sync/map_reference_test.go ./server/sync/map.go ./server/sync/map_bench_test.go ./server/server.go ./server/http.go ./server/client.go ./server/api/server.go ./server/tls.go ./server/config.go ./server/conn.go ./server/http_test.go ./client/release.go ./client/api/listener.go ./client/api/conn.go ./client/api/server.go ./client/task.go ./client/client.go ./client/webrtc/integrate_test.go ./client/webrtc/datachannel.go ./client/webrtc/icecandidate.go ./client/webrtc/speedtest/client/main.go ./client/webrtc/speedtest/echoServer/main.go ./client/webrtc/sessiondescription.go ./client/webrtc/logging.go ./client/webrtc/peerconnection.go ./client/client_test.go ./client/conn.go ./client/tcpforward.go ./client/idle.go ./client/task_test.go ./client/debug.go ./client/config.go ./client/peer.go ./pool/pool.go ./test/tls_test.go ./test/p2p_test.go ./test/tunnel_test.go ./test/integrate_test.go ./test/services_test.go golangci-lint --version || go install github.com/golangci/golangci-lint/cmd/[email protected] golangci-lint has version (devel) built with go1.20.7 from (unknown, mod sum: "") on (unknown) golangci-lint run \ --skip-dirs client/std \ --skip-dirs dep \ --skip-dirs bufio \ --skip-dirs logger/file-rotatelogs \ --skip-dirs build \ --skip-dirs release \ --exclude 'SA6002: argument should be pointer-like to avoid allocations' \ --exclude 'S1000: should use a simple channel send/receive instead of
selectwith a single case' client/api/server.go:56:12: s.Serve undefined (type *Server has no field or method Serve) (typecheck) err := s.Serve(s.Listener) ^ client/webrtc/datachannel.go:21:8: could not import C (cgo preprocessing failed) (typecheck) import "C" ^ client/webrtc/datachannel.go:77:11: undefined: pointer (typecheck) d, ok := pointer.Restore(userData).(*DataChannel) ^ client/webrtc/datachannel.go:90:11: undefined: pointer (typecheck) d, ok := pointer.Restore(userData).(*DataChannel) ^ client/webrtc/datachannel.go:106:11: undefined: pointer (typecheck) d, ok := pointer.Restore(userData).(*DataChannel) ^ logger/logger.go:144:6: l.Error undefined (type *Logger has no field or method Error) (typecheck) l.Error().Err(err).Msg("failed to close sentry") ^ logger/logger.go:150:6: l.Error undefined (type *Logger has no field or method Error) (typecheck) l.Error().Err(err).Msg("failed to sync log file") ^ logger/logger.go:154:6: l.Error undefined (type *Logger has no field or method Error) (typecheck) l.Error().Err(err).Msg("failed to close log file") ^ server/api/server.go:153:27: s.Addr undefined (type *Server has no field or method Addr) (typecheck) "-local", "http://" + s.Addr, ^ client/client.go:415:5: t.SendForceCloseSignal undefined (type *conn has no field or method SendForceCloseSignal) (typecheck) t.SendForceCloseSignal() ^ client/client.go:439:5: t.SendCloseSignal undefined (type *conn has no field or method SendCloseSignal) (typecheck) t.SendCloseSignal() ^ client/client.go:467:9: result.Logger undefined (type *conn has no field or method Logger) (typecheck) result.Logger = c.Logger.With().Uint("connID", connID).Logger() ^ client/client.go:783:14: t.Write undefined (type *conn has no field or method Write) (typecheck) _, err = t.Write(buf[:n+i]) ^ client/client.go:787:5: t.Logger undefined (type *conn has no field or method Logger) (typecheck) t.Logger.Info().Msg("sent reload info") ^ client/conn.go:63:13: c.Conn undefined (type *conn has no field or method Conn) (typecheck) _, err = c.Conn.Write(buf[:bufIndex+n]) ^ client/conn.go:139:5: c.Logger undefined (type *conn has no field or method Logger) (typecheck) c.Logger.Debug().Err(err).Msg("failed to send ping signal") ^ client/conn.go:145:8: c.Closing undefined (type *conn has no field or method Closing) (typecheck) if !c.Closing.CompareAndSwap(0, 1) { ^ client/conn.go:171:5: c.Logger undefined (type *conn has no field or method Logger) (typecheck) c.Logger.Info().Err(err).Bool("isClosing", isClosing).Uint64("finishedTasks", c.finishedTasks.Load()). ^ client/conn.go:174:20: c.Reader undefined (type *conn has no field or method Reader) (typecheck) pool.PutReader(c.Reader) ^ client/conn.go:178:15: c.Reader undefined (type *conn has no field or method Reader) (typecheck) r.Reader = c.Reader ^ client/conn.go:188:12: c.Conn undefined (type *conn has no field or method Conn) (typecheck) err = c.Conn.SetReadDeadline(time.Now().Add(timeout)) ^ client/conn.go:194:22: c.Reader undefined (type *conn has no field or method Reader) (typecheck) peekBytes, err = c.Reader.Peek(4) ^ client/conn.go:198:7: c.Logger undefined (type *conn has no field or method Logger) (typecheck) c.Logger.Info().Bool("isClosing", isClosing).Uint64("finishedTasks", c.finishedTasks.Load()). ^ client/conn.go:222:8: c.SendCloseSignal undefined (type *conn has no field or method SendCloseSignal) (typecheck) c.SendCloseSignal() ^ client/peer.go:184:16: c.Write undefined (type *conn has no field or method Write) (typecheck) _, wErr = c.Write(buf[:6]) ^ client/peer.go:213:15: c.Write undefined (type *conn has no field or method Write) (typecheck) _, wErr = c.Write(buf[:l]) ^ client/peer.go:220:13: c.Conn undefined (type *conn has no field or method Conn) (typecheck) wErr = c.Conn.SetReadDeadline(dl) ^ client/task.go:246:13: c.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) count := c.TasksCount.Add(1) ^ client/task.go:255:16: c.Write undefined (type *conn has no field or method Write) (typecheck) _, wErr = c.Write(buf[:6]) ^ client/task.go:264:8: c.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) if c.TasksCount.Add(^uint32(0)) == 0 { ^ client/task.go:266:9: c.IsClosing undefined (type *conn has no field or method IsClosing) (typecheck) if c.IsClosing() { ^ client/task.go:267:7: c.SendForceCloseSignal undefined (type *conn has no field or method SendForceCloseSignal) (typecheck) c.SendForceCloseSignal() ^ server/server.go:64:16: undefined: turn (typecheck) turnServer *turn.Server ^ server/client.go:103:13: t.SendErrorSignalReachedMaxConnections undefined (type *conn has no field or method SendErrorSignalReachedMaxConnections) (typecheck) if e := t.SendErrorSignalReachedMaxConnections(); e != nil { ^ server/client.go:104:6: t.Logger undefined (type *conn has no field or method Logger) (typecheck) t.Logger.Error().Err(e).Msg("failed to SendErrorSignalReachedMaxConnections") ^ server/client.go:114:5: t.Logger undefined (type *conn has no field or method Logger) (typecheck) t.Logger.Info(). ^ server/client.go:119:11: tunnel.Logger undefined (type *conn has no field or method Logger) (typecheck) tunnel.Logger.Info(). ^ server/client.go:124:12: tunnel.Logger undefined (type *conn has no field or method Logger) (typecheck) tunnel.Logger.Info(). ^ server/client.go:133:14: t.SendErrorSignalDifferentConfigClientConnected undefined (type *conn has no field or method SendErrorSignalDifferentConfigClientConnected) (typecheck) if e := t.SendErrorSignalDifferentConfigClientConnected(); e != nil { ^ server/client.go:166:11: tunnel.Logger undefined (type *conn has no field or method Logger) (typecheck) tunnel.Logger.Info(). ^ server/client.go:179:11: tunnel.SendCloseSignal undefined (type *conn has no field or method SendCloseSignal) (typecheck) tunnel.SendCloseSignal() ^ server/client.go:269:9: conn.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) conn.TasksCount.Add(1) ^ server/client.go:275:14: t.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) count := t.TasksCount.Load() ^ server/client.go:278:9: conn.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) conn.TasksCount.Add(1) ^ server/client.go:287:8: conn.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) conn.TasksCount.Add(1) ^ server/client.go:296:6: t.SendForceCloseSignal undefined (type *conn has no field or method SendForceCloseSignal) (typecheck) t.SendForceCloseSignal() ^ server/client.go:297:6: t.Close undefined (type *conn has no field or method Close) (typecheck) t.Close() ^ server/client.go:308:5: t.Shutdown undefined (type *conn has no field or method Shutdown) (typecheck) t.Shutdown() ^ server/client.go:434:10: conn.Logger undefined (type *conn has no field or method Logger) (typecheck) conn.Logger.Error().Err(err).Msg("openSpecifiedTCPPort") ^ server/conn.go:67:5: nc.Logger undefined (type *conn has no field or method Logger) (typecheck) nc.Logger = s.Logger.With(). ^ make: *** [Makefile:74:golangci-lint] 错误 1 ya@ya-linux:~/work/gt$ ^C ya@ya-linux:~/work/gt$ ya@ya-linux:~/work/gt$ ya@ya-linux:~/work/gt$ ya@ya-linux:~/work/gt$ ya@ya-linux:~/work/gt$ ya@ya-linux:~/work/gt$ make release sh -c "command -v gn" make: *** [Makefile:144:check_webrtc_dependencies] 错误 127 ya@ya-linux:~/work/gt$ make -j8 gofumpt --version || go install mvdan.cc/gofumpt@latest golangci-lint --version || go install github.com/golangci/golangci-lint/cmd/[email protected] v0.5.0 (go1.18.1) gofumpt -l -w ./conn/conn.go ./predef/version.go ./predef/release.go ./predef/const.go ./predef/debug.go ./util/rand.go ./util/portrange.go ./util/portrange_test.go ./util/blockvalue_test.go ./util/blockvalue.go ./config/position_test.go ./config/slice_test.go ./config/positionslice_test.go ./config/slice.go ./config/config.go ./config/config_test.go ./config/positionslice.go ./config/position.go ./logger/logger.go ./cmd/server/main.go ./cmd/client/main.go ./server/user_test.go ./server/tls_test.go ./server/sync/map_test.go ./server/sync/create.go ./server/sync/map_reference_test.go ./server/sync/map.go ./server/sync/map_bench_test.go ./server/server.go ./server/http.go ./server/client.go ./server/api/server.go ./server/tls.go ./server/config.go ./server/conn.go ./server/http_test.go ./client/release.go ./client/api/listener.go ./client/api/conn.go ./client/api/server.go ./client/task.go ./client/client.go ./client/webrtc/integrate_test.go ./client/webrtc/datachannel.go ./client/webrtc/icecandidate.go ./client/webrtc/speedtest/client/main.go ./client/webrtc/speedtest/echoServer/main.go ./client/webrtc/sessiondescription.go ./client/webrtc/logging.go ./client/webrtc/peerconnection.go ./client/client_test.go ./client/conn.go ./client/tcpforward.go ./client/idle.go ./client/task_test.go ./client/debug.go ./client/config.go ./client/peer.go ./pool/pool.go ./test/tls_test.go ./test/p2p_test.go ./test/tunnel_test.go ./test/integrate_test.go ./test/services_test.go sh -c "command -v gn" git submodule update --init --recursive make: *** [Makefile:144:check_webrtc_dependencies] 错误 127 make: *** 正在等待未完成的任务.... golangci-lint has version (devel) built with go1.20.7 from (unknown, mod sum: "") on (unknown) golangci-lint run \ --skip-dirs client/std \ --skip-dirs dep \ --skip-dirs bufio \ --skip-dirs logger/file-rotatelogs \ --skip-dirs build \ --skip-dirs release \ --exclude 'SA6002: argument should be pointer-like to avoid allocations' \ --exclude 'S1000: should use a simple channel send/receive instead of
selectwith a single case' client/api/server.go:56:12: s.Serve undefined (type *Server has no field or method Serve) (typecheck) err := s.Serve(s.Listener) ^ client/webrtc/datachannel.go:21:8: could not import C (cgo preprocessing failed) (typecheck) import "C" ^ client/webrtc/datachannel.go:77:11: undefined: pointer (typecheck) d, ok := pointer.Restore(userData).(*DataChannel) ^ client/webrtc/datachannel.go:90:11: undefined: pointer (typecheck) d, ok := pointer.Restore(userData).(*DataChannel) ^ client/webrtc/datachannel.go:106:11: undefined: pointer (typecheck) d, ok := pointer.Restore(userData).(*DataChannel) ^ logger/logger.go:144:6: l.Error undefined (type *Logger has no field or method Error) (typecheck) l.Error().Err(err).Msg("failed to close sentry") ^ logger/logger.go:150:6: l.Error undefined (type *Logger has no field or method Error) (typecheck) l.Error().Err(err).Msg("failed to sync log file") ^ logger/logger.go:154:6: l.Error undefined (type *Logger has no field or method Error) (typecheck) l.Error().Err(err).Msg("failed to close log file") ^ server/api/server.go:153:27: s.Addr undefined (type *Server has no field or method Addr) (typecheck) "-local", "http://" + s.Addr, ^ client/client.go:415:5: t.SendForceCloseSignal undefined (type *conn has no field or method SendForceCloseSignal) (typecheck) t.SendForceCloseSignal() ^ client/client.go:439:5: t.SendCloseSignal undefined (type *conn has no field or method SendCloseSignal) (typecheck) t.SendCloseSignal() ^ client/client.go:467:9: result.Logger undefined (type *conn has no field or method Logger) (typecheck) result.Logger = c.Logger.With().Uint("connID", connID).Logger() ^ client/client.go:783:14: t.Write undefined (type *conn has no field or method Write) (typecheck) _, err = t.Write(buf[:n+i]) ^ client/client.go:787:5: t.Logger undefined (type *conn has no field or method Logger) (typecheck) t.Logger.Info().Msg("sent reload info") ^ client/conn.go:63:13: c.Conn undefined (type *conn has no field or method Conn) (typecheck) _, err = c.Conn.Write(buf[:bufIndex+n]) ^ client/conn.go:139:5: c.Logger undefined (type *conn has no field or method Logger) (typecheck) c.Logger.Debug().Err(err).Msg("failed to send ping signal") ^ client/conn.go:145:8: c.Closing undefined (type *conn has no field or method Closing) (typecheck) if !c.Closing.CompareAndSwap(0, 1) { ^ client/conn.go:171:5: c.Logger undefined (type *conn has no field or method Logger) (typecheck) c.Logger.Info().Err(err).Bool("isClosing", isClosing).Uint64("finishedTasks", c.finishedTasks.Load()). ^ client/conn.go:174:20: c.Reader undefined (type *conn has no field or method Reader) (typecheck) pool.PutReader(c.Reader) ^ client/conn.go:178:15: c.Reader undefined (type *conn has no field or method Reader) (typecheck) r.Reader = c.Reader ^ client/conn.go:188:12: c.Conn undefined (type *conn has no field or method Conn) (typecheck) err = c.Conn.SetReadDeadline(time.Now().Add(timeout)) ^ client/conn.go:194:22: c.Reader undefined (type *conn has no field or method Reader) (typecheck) peekBytes, err = c.Reader.Peek(4) ^ client/conn.go:198:7: c.Logger undefined (type *conn has no field or method Logger) (typecheck) c.Logger.Info().Bool("isClosing", isClosing).Uint64("finishedTasks", c.finishedTasks.Load()). ^ client/conn.go:222:8: c.SendCloseSignal undefined (type *conn has no field or method SendCloseSignal) (typecheck) c.SendCloseSignal() ^ client/peer.go:184:16: c.Write undefined (type *conn has no field or method Write) (typecheck) _, wErr = c.Write(buf[:6]) ^ client/peer.go:213:15: c.Write undefined (type *conn has no field or method Write) (typecheck) _, wErr = c.Write(buf[:l]) ^ client/peer.go:220:13: c.Conn undefined (type *conn has no field or method Conn) (typecheck) wErr = c.Conn.SetReadDeadline(dl) ^ client/task.go:246:13: c.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) count := c.TasksCount.Add(1) ^ client/task.go:255:16: c.Write undefined (type *conn has no field or method Write) (typecheck) _, wErr = c.Write(buf[:6]) ^ client/task.go:264:8: c.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) if c.TasksCount.Add(^uint32(0)) == 0 { ^ client/task.go:266:9: c.IsClosing undefined (type *conn has no field or method IsClosing) (typecheck) if c.IsClosing() { ^ client/task.go:267:7: c.SendForceCloseSignal undefined (type *conn has no field or method SendForceCloseSignal) (typecheck) c.SendForceCloseSignal() ^ server/server.go:64:16: undefined: turn (typecheck) turnServer *turn.Server ^ server/client.go:103:13: t.SendErrorSignalReachedMaxConnections undefined (type *conn has no field or method SendErrorSignalReachedMaxConnections) (typecheck) if e := t.SendErrorSignalReachedMaxConnections(); e != nil { ^ server/client.go:104:6: t.Logger undefined (type *conn has no field or method Logger) (typecheck) t.Logger.Error().Err(e).Msg("failed to SendErrorSignalReachedMaxConnections") ^ server/client.go:114:5: t.Logger undefined (type *conn has no field or method Logger) (typecheck) t.Logger.Info(). ^ server/client.go:119:11: tunnel.Logger undefined (type *conn has no field or method Logger) (typecheck) tunnel.Logger.Info(). ^ server/client.go:124:12: tunnel.Logger undefined (type *conn has no field or method Logger) (typecheck) tunnel.Logger.Info(). ^ server/client.go:133:14: t.SendErrorSignalDifferentConfigClientConnected undefined (type *conn has no field or method SendErrorSignalDifferentConfigClientConnected) (typecheck) if e := t.SendErrorSignalDifferentConfigClientConnected(); e != nil { ^ server/client.go:166:11: tunnel.Logger undefined (type *conn has no field or method Logger) (typecheck) tunnel.Logger.Info(). ^ server/client.go:179:11: tunnel.SendCloseSignal undefined (type *conn has no field or method SendCloseSignal) (typecheck) tunnel.SendCloseSignal() ^ server/client.go:269:9: conn.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) conn.TasksCount.Add(1) ^ server/client.go:275:14: t.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) count := t.TasksCount.Load() ^ server/client.go:278:9: conn.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) conn.TasksCount.Add(1) ^ server/client.go:287:8: conn.TasksCount undefined (type *conn has no field or method TasksCount) (typecheck) conn.TasksCount.Add(1) ^ server/client.go:296:6: t.SendForceCloseSignal undefined (type *conn has no field or method SendForceCloseSignal) (typecheck) t.SendForceCloseSignal() ^ server/client.go:297:6: t.Close undefined (type *conn has no field or method Close) (typecheck) t.Close() ^ server/client.go:308:5: t.Shutdown undefined (type *conn has no field or method Shutdown) (typecheck) t.Shutdown() ^ server/client.go:434:10: conn.Logger undefined (type *conn has no field or method Logger) (typecheck) conn.Logger.Error().Err(err).Msg("openSpecifiedTCPPort") ^ server/conn.go:67:5: nc.Logger undefined (type *conn has no field or method Logger) (typecheck) nc.Logger = s.Logger.With(). ^ make: *** [Makefile:74:golangci-lint] 错误 1
hi :
the document mentions supporting WebRTC peer-to-peer connections. ,so,
how can I achieve WebRTC peer-to-peer connection using GT ?
部署的方法没看到文档参考啊,另外网页管理什么时候能出啊
报名地址:https://summer-ospp.ac.cn/org/prodetail/24c570189?lang=zh&list=pro
AO.space GT Connect 子命令功能开发
AO.space GT 是一款注重稳定性和性能的高效 WebSocket(s)/HTTP(s)/TCP 代理工具,目前具备 server 和 client 子命令,支持 NAT 穿透。本项目旨在开发一个新的 connect 子命令,该命令将扩展 GT 的功能,使其能够与 client 子命令建立 P2P 连接。这一功能的实现将显著提高数据传输效率,降低服务器负载和网络延迟。connect 子命令将智能选择是通过服务中转还是直接 P2P 连接,以确保数据安全、高效地传输至客户端。
进阶
AO.space GT Connect Subcommand Development
AO.space GT is a high-performance WebSocket(s)/HTTP(s)/TCP proxy tool with a focus on stability and performance. It currently features server and client subcommands and supports NAT traversal. This project aims to develop a new connect subcommand that will expand the capabilities of GT, enabling it to establish P2P connections with the client subcommand. The implementation of this feature will significantly enhance data transfer efficiency, reduce server load, and decrease network latency. The connect subcommand will intelligently select whether to use service relay or direct P2P connection to ensure that data is securely and efficiently transmitted to the client.
Advanced
To improve the user experience, we plan to add web management functions for GT server and GT client respectively, supporting: administrator login, connection status view, configuration management, pprof, etc.
Open Source Summer Official Website
为了提高用户体验,计划分别为 GT server 和 GT client 增加 Web 管理功能,支持:管理员登录、连接状态查看,配置管理,pprof等
The connection between GT server and GT client is currently based on the TCP protocol. In order to improve the performance in long distance, high latency and high packet loss scenarios (mainly multinational scenarios), it is necessary to add support for the QUIC protocol based connection method and to consider supporting the BBR congestion control algorithm; and to consider adding some intelligent switching strategies to improve the user experience.
Open Source Summer Official Website
目前 GT server 与 GT client 之间的连接是基于 TCP 协议实现的,为了提高在远距离,高延迟,高丢包率场景下的传输的表现(主要是跨国场景),增加支持基于 QUIC 协议的连接方式,需要考虑支持 BBR 拥塞控制算法;并可以考虑增加一定的智能切换策略,提高用户体验。
从测试结果来看,或许gt在未来能取代frp,但网上的教程太少了,md文档里提供的配置不太明确,能提供简易的例子或提供docker镜像最好了,现在使用gt相较于frp学习成本较高
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.