{"id":36490170,"url":"https://github.com/chenqinghe/sockit","last_synced_at":"2026-01-12T01:55:06.396Z","repository":{"id":61394742,"uuid":"435494044","full_name":"chenqinghe/sockit","owner":"chenqinghe","description":"a lightweight socket framework ","archived":false,"fork":false,"pushed_at":"2023-02-14T03:49:44.000Z","size":91,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-06-20T16:45:21.582Z","etag":null,"topics":["socket","websocket"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chenqinghe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-06T12:47:34.000Z","updated_at":"2022-02-21T06:35:26.000Z","dependencies_parsed_at":"2024-06-20T16:29:49.796Z","dependency_job_id":"bf23d996-94e6-4d39-9c01-5d87b99f6083","html_url":"https://github.com/chenqinghe/sockit","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/chenqinghe/sockit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenqinghe%2Fsockit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenqinghe%2Fsockit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenqinghe%2Fsockit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenqinghe%2Fsockit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chenqinghe","download_url":"https://codeload.github.com/chenqinghe/sockit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenqinghe%2Fsockit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28331306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T00:36:25.062Z","status":"ssl_error","status_checked_at":"2026-01-12T00:36:15.229Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["socket","websocket"],"created_at":"2026-01-12T01:55:05.755Z","updated_at":"2026-01-12T01:55:06.389Z","avatar_url":"https://github.com/chenqinghe.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sockit (Socket kit)\n\n该库是对socket连接各项功能的一个封装，使用方式类似http标准库。包含以下功能：\n1. 自定义封包、解包\n2. 自定义鉴权\n3. 连接管理\n4. 其他\n\n\n## 整体架构\n\n![overview](./images/overview.png)\n\n\n整体架构比较清晰，主要包括以下模块：\n- Server\n- ConnManager\n- Codec\n- Authenticator\n- Handler\n\n以上全部为接口类型，在使用中均可以自定义或者扩展已有功能。\n\n\n### Server\n\nServer主要负责监听端口，接收连接，然后调用ConnManager的StoreConn方法，将连接进行保存管理。\n### ConnManager\nConnManager是整个proxy的核心，负责管理连接系统。但是其定义却比较简单：\n```go\ntype ConnManager interface {\n\tStoreConn(c Conn)\n\tRemoveSession(id int64) error\n\tHandler() Handler\n\tClose() error\n}\n```\n\n主要就是StoreConn和RemoveSession两个方法，分别用于存储接收到的连接以及移除某个Session（Conn和Session的区别：未经鉴权的为Conn，经过鉴权，确认了身份的为Session）。\n\nproxy提供了默认的ConnManager，具有管理连接、维持心跳等功能，可以直接使用。\n\n```go\ntype Manager struct {\n\tmu    *sync.RWMutex\n\tconns map[int64]*Session\n\n\tAuthenticator Authenticator\n\thandler       Handler\n\n\tkeepaliveTick   time.Duration\n\tkeepaliveTicker *time.Ticker\n\n\tclosed    chan struct{}\n\tcloseDone chan struct{}\n}\n```\n\n### Codec\nCodec主要用来实现编解码，其类型为一个接口：\n```go\n\ntype Codec interface {\n\tRead(reader io.Reader) (p Packet, err error)\n\tWrite(writer io.Writer, p Packet) error\n}\n\n```\nRead方法从连接中读取数据并封装为一个Packet，Write方法将一个Packet序列化为字节流，然后写入连接中。\nPacket同样也是一个接口：\n```go\ntype Packet interface {\n\t// Id 获取包的id\n\tId() int32\n\n\t// Time 获取包发送的时间\n\tTime() time.Time\n}\n```\n具体Packet类型由用户自己实现，解码得到的Packet会原样传给后续的处理流程，在后续的处理流程中进行类型的判断或者断言。\n\n### Authenticator\n\nAuthenticator主要用于权限校验及用户认证，其类型申明如下：\n\n```go\ntype Authenticator interface {\n\tAuth(c Conn) (User, error)\n}\n\ntype User interface {\n\tValid() bool\n\tId() string\n}\n\n```\nAuthenticator接受一个连接，可以从中读取Packet进行判断，也可以获取对端的ip地址等进行判断，如果鉴权失败\n可以返回一个error，由上端来关闭连接。\n鉴权成功后，需要返回一个User用户信息，上端通过Valid方法来判断鉴权是否成功，是否是个合法用户，\n通过Id方法可以来获取用户标识。\n\n\n### Handler\n\nHandler是处理各种逻辑的主要入口。Handler定义如下：\n```go\ntype Handler interface {\n\tHandle(packet Packet, s *Session)\n}\n```\nHandler首先接受一个Packet参数，Packet为经过Codec.Read返回的参数，同时还接受一个*Session类型的参数\n，该参数标识当前的会话，用户可在当前会话中保存一些自定义的数据。\n\n```go\n\nfunc (h Handler)Handle(p Packet, s *Session) {\n\ts.Set(\"name\", p.(NamePacket).Name)\n\ts.Set(\"isLogin\", true)\n}\n\n```\n同时，也可以给通过*Session来给对端发送Packet等。这一块的逻辑实际上有点类型于标准库的http的\nHandler的逻辑，接收一个*http.Request，然后通过ResponseWriter返回数据。\n\nHandle方法主要是用于处理客户端主动发送过来的数据包，如果想要主动给客户端发送消息，可在Handler中保存Manager，然后获取或者遍历所有的Session进行发送\n数据。例如：\n\n\n```go\n\ntype handler struct {\n    mgr *Manager\n}\n\nfunc (h *handler) Handle(p Packet, s *Session) {\n    cid := p.(NotifyPacket).ClientId\n\n    // notify all sessions\n    h.mgr.RangeSession(func(sess *Session) {\n    \tif s.Id()!=sess.Id(){\n            pkt := \u0026msgPkt{}\n            pkt.cid = cid\n            // .....\n            sess.SendPacket(pkt)\n        }\n    })\n}\n\n\n```\n\n以上所有模块均可自己实现，也可以通过嵌套的方式扩展现有模块的功能。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenqinghe%2Fsockit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchenqinghe%2Fsockit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenqinghe%2Fsockit/lists"}