目录
- 0. RSocket 简介
-
1. 服务端
- 1.1 SETUP阶段 - 处理客户端发起的连接请求
- 1.2 保存客户端的 Requester
- 2. 客户端
0. RSocket 简介
参考阿里云开发者社区的介绍
相关文档和资料:
rsocket-java 原生库例子
在这里我们在客户端使用 rsocket-java 原生库,在服务端使用 spring-boot-starter-rsocket。
1. 服务端
1.1 SETUP阶段 - 处理客户端发起的连接请求
新建一个 RSocketController
类来处理 RSocket 相关的请求。
@Controller
public class RSocketController {
private static Logger logger = LoggerFactory.getLogger(RSocketController.class;
// 对到来的连接做一些处理
@ConnectMapping("connect.setup"
public Mono<Void> setup(String data, RSocketRequester rSocketRequester {
logger.info("[connect.setup]Client connection: {}\n", data;
return Mono.empty(;
}
}
RSocket 的 metadata
中可以包含路由(Routing)信息,这和 一般 WEB 框架通过解析 URL 将请求导向不同的处理函数是一样的。在连接建立时,客户端会发送一个 SETUP Payload,@ConnectMapping
可以通过解析 SETUP Payload 的 metadata
中的路由信息来使用不同的连接建立阶段的处理函数。在这里,只要 SETUP Payload 的 metadata
中的路由信息是 connect.setup
,该函数就会处理建立连接后客户端发送的 SETUP Payload。
1.2 保存客户端的 Requester
RSocketRequester 对象以便服务端在需要时向客户端发起请求。
data 中。然后我们声明一个类来保存 RSocketRequester
,代码如下:
public class ConnectedClient {
public RSocketRequester requester;
public Date connectedTime;
ConnectedClient(RSocketRequester requester {
this.requester = requester;
this.connectedTime = new Date(;
}
}
然后我们建立一个 Service 来管理客户端的 RSocketRequester
。在这里使用 ConcurrentHashMap
来存储 Requester,键是客户端的 UUID,值是 ConnectedClient
对象。
@Service
public class ConnectedClientsManager {
private static Logger logger = LoggerFactory.getLogger(ConnectedClientsManager.class;
public final ConcurrentHashMap<String, ConnectedClient> clients;
public ConnectedClientsManager( {
this.clients = new ConcurrentHashMap<>(;
}
public Set<String> getAllClientIdentifier( {
return this.clients.keySet(;
}
public RSocketRequester getClientRequester(String clientIdentifier {
return this.clients.get(clientIdentifier.requester;
}
public void putClientRequester(String clientIdentifier, RSocketRequester requester {
requester.rsocket(
.onClose(