如何发送buf然后接收消息
方法
Mono<ByteBuf> send(ByteBuf buf){
// how to send the buf then receive a msg
}
我正在尝试通过从连接出站发送消息并从入站接收消息,然后返回消息Mono来实现此方法。但是我只能在then(Publisher)方法中接收消息。它似乎无法返回数据Mono
我已经尝试过了。
// the connecttion has been initialized before entering this method.
Mono.just(buf)
.doOnNext(data -> connection.outbound().sendObject(data).then().subscribe())
.then(connection
.inbound()
.receiveObject()
.single()
.map(RpcDataPackage.class::cast)
.map(RpcDataPackage::getData)
.map(data -> {
try {
return resCodec.decode(data);
} catch (IOException e) {
throw new RpcRequestException(e);
}
})
);
但是它将一直阻塞直到连接超时
我已经尝试了另一个代码。我添加了一个handle
方法,并将响应放入地图中。
然后,我可以在Mono.fromSupply()
处使用while循环中断来获取map.get(key) != null
。
它将阻塞线程。
.handle(((nettyInbound, nettyOutbound) -> nettyInbound
.receiveObject()
.map(RpcDataPackage.class::cast)
.doOnNext(pkg -> {
String responseKey = "a key"
responseMap.put(responseKey, pkg);
})
.then()))
答案 0 :(得分:0)
您未指定期望的内容。 参见下面的示例,它发送一些数据,然后接收服务器返回的内容。
@Test
public void test() {
Connection connection =
TcpClient.create()
.wiretap(true)
.host("example.com")
.port(80)
.connect()
.block();
assertNotNull(connection);
connection.outbound()
.sendObject(Unpooled.wrappedBuffer("test".getBytes()))
.then(connection.inbound()
.receiveObject()
.last()
.doOnNext(System.out::println)
.then())
.then()
.block();
}
答案 1 :(得分:0)
我阅读了Mono Javadoc并找到了MonoSink。
Mono.create(monoSink -> {
// some call
})
入站收到对象响应时,只需执行sink.success()
答案 2 :(得分:0)
您应该结合使用NettyOutbound :: then来侦听写完成和Mono :: then来组合写之后读取NettyInboud。
Mono<String> resposeMono = TcpClient.create()
.connect()
.flatMap(connection -> connection.outbound().sendString(Mono.just("Hello!"))
.then()
.then(connection.inbound().receive().aggregate().asString())
.doOnTerminate(connection::dispose));
这将写“你好!”到输出,从输入中读取所有字节作为字符串,然后释放连接。