# socketd-python **Repository Path**: baichen9187/socketd-python ## Basic Information - **Project Name**: socketd-python - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-10 - **Last Updated**: 2023-12-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: Socket, Python ## README

Socket.D

基于连接和语义消息流的网络应用开发框架

socketd python10 qq


Socket.D 是一种新的通讯应用协议,也是一个开发框架。可以在客户端和服务端之间“简单”、“快速”、“高质”的流式通讯。 ### 体验效果 有用户说:“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。极大简化了 Socket 的开发体验。 ### 主要特性 * 异步通讯,由带语义的事件消息驱动 * 语言无关,使用二进制通信协议(支持 tcp, ws, udp)。支持多语言、多平台 * 背压流控,请求时不让你把服务端发死了 * 断线重连,自动连接恢复 * 多路复用 * 双向通讯,单链接双向互听互发 * 自动分片,数据超出 16Mb,会自动分片、自动重组(udp 除外) * 扩展定制,可为数据添加 meta 语义标注(就像 http header) * 接口简单 ### 与 http、websocket 的简单对比 | 对比项目 | socket.d | http | websocket(ws) | 备注 | |-------------|--------------|------|---------------|------------------| | 发消息(Qos0) | 有 | 无 | 有 | 适合监听埋点,日志上报 | | 发送并请求(Qos1) | 有 | 有 | 无 | 适合马上答复确认 | | 发送并订阅(流) | 有 | 无 | 无 | 适合视频播放之类的,分块流式获取 | | 答复或响应 | 有 | 有 | 无 | | | 单连接双向通讯 | 有 | 无 | 有(不便) | 双向互发、互听。适合反向调服务 | | 数据分片 | 有 | / | 无 | 适合大文件上传 | | 断线自动重连 | 有 | / | 无 | | | 有元信息或头信息 | 有 | 有 | 无 | | | 基础传输协议 | tcp, udp, ws | tcp | http | | ### 适用场景 可用于 MSG、RPC、IM、MQ 等一些的场景开发,可替代 Http, Websocket, gRpc 等一些协议。比如移动设备与服务器的连接,比如一些微服务场景等等。 ### 简单的协议说明( 详见:[《协议文档》](protocol.md) ) * 连接地址风格 ``` sd:tcp://19.10.2.3:9812/path?u=noear&t=1234 sd:udp://19.10.2.3:9812/path?u=noear&t=1234 sd:ws://19.10.2.3:1023/path?u=noear&t=1234 ``` * 帧码结构 ``` //udp only <2k [len:int][flag:int][sid:str(<64)][\n][event:str(<512)][\n][metaString:str(<4k)][\n][data:byte(<16m)] ``` * 指令流 | Flag | Server | Client | |-----------|--------------------------------------|-------------------------------------------------------| | Unknown | ::close() | ::close() | | Connect | / | c(Connect)->s::onOpen(),s(Connack?)->c::onOpen() | | Connack | ->s::onOpen(),s(Connack?)->c | / | | Ping | / | c(Ping)->s(Pong)->c | | Pong | ->s(Pong)->c | / | | Close | s(Close)->c | c(Close)->s | | Message | s(Message)->c | c(Message)->s | | Request | s(Request)->c(Reply or ReplyEnd)->s | c(Request)->s(Reply or ReplyEnd)->c | | Subscribe | s(Subscribe)->c(Reply...ReplyEnd)->s | c(Subscribe)->s(Reply...ReplyEnd)->c | | Reply | ->s(Reply)->c | ->c(Reply)->s | | ReplyEnd | ->s(ReplyEnd)->c | ->c(ReplyEnd)->s | ``` //The reply acceptor registration in the channel is removed after the reply is completed ``` ### 快速入门与学习 * 学习 请点击:[《快速入门与学习》](_docs/)。Java 之外的语言与平台会尽快跟进(欢迎有兴趣的同学加入社区) * 规划情况了解 | 语言或平台 | 客户端 | 服务端 | 备注 | |--------|-----|----|----------------------| | java | 已完成 | 已完成 | 支持 tcp, udp, ws 通讯架构 | | js | 开发中 | / | 支持 ws 通讯架构 | | python | 开发中 | / | 支持 ws 通讯架构 | | 其它 | 计划中 | 计划中 | | ## 快速入门 ```python async def application(): # 服务端 server: Server = SocketD.create_server(ServerConfig("ws").set_port(9999)) server_session: WebSocketServer = await server.config(idGenerator).listen( SimpleListenerTest()).start() # 客户端 client_session: Session = await SocketD.create_client("ws://127.0.0.1:9999") \ .config(idGenerator).open() start_time = time.monotonic() for _ in range(100): await client_session.send("demo", StringEntity("test")) await client_session.send_and_request("demo", StringEntity("test"), 100) await client_session.send_and_subscribe("demo", StringEntity("test"), send_and_subscribe_test, 100) end_time = time.monotonic() logger.info(f"Coroutine send took {(end_time - start_time) * 1000.0} monotonic to complete.") await client_session.close() server_session.close() await server.stop() asyncio.run(application()) ``` 非windows用户可以引入以下依赖,性能提升2倍,asyncio(协程)性能直逼Go ```python import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) ```