代码拉取完成,页面将自动刷新
基于连接和语义消息流的网络应用开发框架
Socket.D 是一种新的通讯应用协议,也是一个开发框架。可以在客户端和服务端之间“简单”、“快速”、“高质”的流式通讯。
有用户说:“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。极大简化了 Socket 的开发体验。
对比项目 | 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())
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。