V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Nazz
V2EX  ›  Go 编程语言

gws v1.6 更新: 支持通过代理拨号

  •  
  •   Nazz · 291 天前 · 901 次点击
    这是一个创建于 291 天前的主题,其中的信息可能已经有所发展或是发生改变。

    gws: amazing fast go websocket server & client, powered by standard net package.

    可能是越来越成熟了, 最近更新频率下降了许多, feture 方面就加了个代理支持

    package main
    
    import (
    	"crypto/tls"
    	"github.com/lxzan/gws"
    	"golang.org/x/net/proxy"
    	"log"
    )
    
    func main() {
    	socket, _, err := gws.NewClient(new(gws.BuiltinEventHandler), &gws.ClientOption{
    		Addr:      "wss://example.com/connect",
    		TlsConfig: &tls.Config{InsecureSkipVerify: true},
    		NewDialer: func() (gws.Dialer, error) {
    			return proxy.SOCKS5("tcp", "127.0.0.1:1080", nil, nil)
    		},
    	})
    	if err != nil {
    		log.Println(err.Error())
    		return
    	}
    	socket.ReadLoop()
    }
    

    性能方面, 关闭压缩时单位 CPU 能效比大幅领先gorilla; 开启压缩的话, 就只有小幅领先了, 优势还是来自 github.com/klauspost/compress, 如果我使用标准库flate的话差距可以忽略不计.

    关闭压缩:

        $ wsbench iops -c 1000 -n 100 -f ./body.json -u ws://127.0.0.1:8000/connect --compress=false
        
        gws:     IOPS=370279 P50=40ms  P90=307ms P99=945ms
        gorilla: IOPS=261866 P50=134ms P90=508ms P99=1664ms
    

    开启压缩:

        $ wsbench iops -c 1000 -n 100 -f ./body.json -u ws://127.0.0.1:8000/connect --compress=true
    
        gws:     IOPS=39660 P50=866ms  P90=1413ms P99=1624ms
        gorilla: IOPS=34668 P50=1058ms P90=1784ms P99=2322ms
    
    ┌─────┬────────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
    │ id  │ name                   │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
    ├─────┼────────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
    │ 1   │ gorilla-linux-amd64    │ default     │ N/A     │ fork    │ 19405    │ 6m     │ 0    │ online    │ 0%       │ 203.9mb  │ caster   │ disabled │
    │ 0   │ gws-linux-amd64        │ default     │ N/A     │ fork    │ 19384    │ 6m     │ 0    │ online    │ 0%       │ 110.8mb  │ caster   │ disabled │
    └─────┴────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
    
    9 条回复    2023-08-26 16:23:31 +08:00
    trzzzz
        1
    trzzzz  
       252 天前 via iPhone
    OP ,我想请教下。之前我做了一个 scp 工具,但是这个是基于 rcp 协议和 ssh 写的 go 版本。感觉传输起来不是很快。我想自己实现协议+使用 OP 的 gws 。OP 有什么建议吗。https://github.com/T-TRz879/scpw/tree/v1.0.0
    Nazz
        2
    Nazz  
    OP
       252 天前 via Android
    @trzzzz 自己实现 server+client ?
    Nazz
        3
    Nazz  
    OP
       252 天前 via Android
    gws 的优势:高性能,支持多种传输层:tcp/kcp/unix socket
    劣势:没有直接支持写入分片帧,需要自行处理文件分片与重组
    trzzzz
        4
    trzzzz  
       252 天前
    @Nazz 是的,OP 可以给点建议吗,比如方向,需要学习哪些前置知识
    Nazz
        5
    Nazz  
    OP
       252 天前 via Android
    @trzzzz 非对称加密,鉴权部分的命令行交互,以及文件传输协议的设计(打包压缩,分片,合并),错误处理。ReadBufferSize 设大点,局域网内单连接够用了,公网上延迟高单连接会有带宽问题。
    Nazz
        6
    Nazz  
    OP
       252 天前 via Android
    再了解下拥塞算法,到公网上实践下,或者局域网内模拟丢包延迟。理论上弱网环境下 kcp 表现会好很多。
    trzzzz
        7
    trzzzz  
       252 天前
    @Nazz 好的,谢谢 OP
    trzzzz
        8
    trzzzz  
       250 天前
    @Nazz OP ,有 gws 的交流群嘛,github 上的 vx 群码过期了。
    Nazz
        9
    Nazz  
    OP
       250 天前 via Android
    @trzzzz 在评论区更新了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2201 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 05:15 · PVG 13:15 · LAX 22:15 · JFK 01:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.