44 Star 469 Fork 115

GVPnoear/socket.d

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
贡献代码
同步代码
西东 2.5.18 92708fc 2个月前
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
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 等一些协议。比如移动设备与服务器的连接,比如一些微服务场景等等。

简单的协议说明( 详见:《协议文档》

  • 连接地址风格
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

快速入门与学习

  • 学习

请点击:《快速入门与学习》。Java 之外的语言与平台会尽快跟进(欢迎有兴趣的同学加入社区)

  • 规划情况了解
语言或平台 客户端 服务端 备注
java 已完成 已完成 支持 tcp, udp, ws 通讯架构
js 开发中 / 支持 ws 通讯架构
python 开发中 / 支持 ws 通讯架构
其它 计划中 计划中

快速入门

使用pip远程安装(暂时没发布)

pip install socketD

或 克隆项目,通过setup.py文件安装到本地

python setup.py build
python setup.py install

或 pip安装到本地

cd \python\socketd
pip install .

快速创建服务器和客户端

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.png"))
        await client_session.send_and_request("demo", StringEntity("test.png"), 100)
        await client_session.send_and_subscribe("demo", StringEntity("test.png"), 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

pip install uvloop
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/noear/socket.d.git
git@gitee.com:noear/socket.d.git
noear
socket.d
socket.d
main

搜索帮助