# socketd **Repository Path**: javanasoda/socketd ## Basic Information - **Project Name**: socketd - **Description**: 基于连接的可扩展消息传输协议 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 114 - **Created**: 2023-11-06 - **Last Updated**: 2023-11-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

SocketD

基于连接的可扩展消息传输协议

Maven Apache 2 jdk-8 jdk-11 jdk-17 jdk-21
gitee star github star



SocketD 是一个基于连接的、可扩展的、主题消息驱动的传输协议。主要特性有: * 异步通讯,非阻塞,由主题消息驱动 * 语言无关,二进制通信协议(支持 tcp, ws, udp)。支持多语言、多平台 * 背压流控,请求时不让你把服务端发死了 * 断线重连,自动连接恢复 * 双向通讯,单链接双向互发双向互听 * 多路复用 * 自动分片,数据超出 16Mb,会自动分片、自动重组(udp 除外) * 扩展定制,可以为数据添加 meta 标注(就像 http header) * 接口简单 ### 快速入门与学习 请点击:[《快速入门与学习》](_docs/)。Java 之外的语言与平台会尽快跟进(欢迎有兴趣的同学加入社区) ### 适用场景 可用于 MSG、RPC、IM、MQ 等一些的场景开发,可替代 Http, Websocket, gRpc 等一些协议。比如移动设备与服务器的连接,比如一些微服务场景等等。 ### 简单的协议 * link (url style) ``` tcp://19.10.2.3:9812/path?u=noear&t=1234 udp://19.10.2.3:9812/path?u=noear&t=1234 ws://19.10.2.3:1023/path?u=noear&t=1234 ``` * codec ``` //udp only <2k, and no auto fragments [len:int][flag:int][sid:str(<64)][\n][topic:str(<512)][\n][metaString:str(<4k)][\n][data:byte(<16m)] ``` * flag & flow | Flag | Server | Client | 备注 | |-----------|--------------------------------------|--------------------------------------|-------------------------| | Unknown | ::close() | ::close() | | | Connect | / | c(Connect)->s(Connack)->c::onOpen() | | | Connack | s(Connack)->c,s::onOpen() | / | | | Ping | / | c(Ping)->s(Pong)->c | | | Pong | s(Pong)->c | / | | | Close | s(Close)->c::onClose() | c(Close)->s::onClose() | 用于特殊场景(如:udp) | | 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 ``` ### 加入到交流群: | QQ交流群:870505482 | 微信交流群(申请时输入:SocketD) | |---------------------------|----------------------------------------| | | 交流群里,会提供 "保姆级" 支持和帮助。如有需要,也可提供技术培训和顾问服务 ### 第一个程序:你好世界! ```java public class Demo { public static void main(String[] args) throws Throwable { //::启动服务端 SocketD.createServer(new ServerConfig("ws")) .listen(new SimpleListener(){ @Override public void onMessage(Session session, Message message) throws IOException { if(message.isRequest()){ session.replyEnd(message, new StringEntity("And you too.")); } } }) .start(); Thread.sleep(1000); //等会儿,确保服务端启动完成 //::打开客户端会话 Session session = SocketD.createClient("ws://127.0.0.1:6329/hello?token=1b0VsGusEkddgr3d") .open(); //发送并请求(且,收回答复) Entity reply = session.sendAndRequest("/demo", new StringEntity("Hello wrold!").meta("user","noear")); } } ```