# 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
基于连接的可扩展消息传输协议
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"));
}
}
```