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

308 天前
 Nazz

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 │
└─────┴────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
915 次点击
所在节点    Go 编程语言
9 条回复
trzzzz
269 天前
OP ,我想请教下。之前我做了一个 scp 工具,但是这个是基于 rcp 协议和 ssh 写的 go 版本。感觉传输起来不是很快。我想自己实现协议+使用 OP 的 gws 。OP 有什么建议吗。https://github.com/T-TRz879/scpw/tree/v1.0.0
Nazz
269 天前
@trzzzz 自己实现 server+client ?
Nazz
269 天前
gws 的优势:高性能,支持多种传输层:tcp/kcp/unix socket
劣势:没有直接支持写入分片帧,需要自行处理文件分片与重组
trzzzz
269 天前
@Nazz 是的,OP 可以给点建议吗,比如方向,需要学习哪些前置知识
Nazz
269 天前
@trzzzz 非对称加密,鉴权部分的命令行交互,以及文件传输协议的设计(打包压缩,分片,合并),错误处理。ReadBufferSize 设大点,局域网内单连接够用了,公网上延迟高单连接会有带宽问题。
Nazz
269 天前
再了解下拥塞算法,到公网上实践下,或者局域网内模拟丢包延迟。理论上弱网环境下 kcp 表现会好很多。
trzzzz
269 天前
@Nazz 好的,谢谢 OP
trzzzz
268 天前
@Nazz OP ,有 gws 的交流群嘛,github 上的 vx 群码过期了。
Nazz
268 天前
@trzzzz 在评论区更新了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/957257

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX