微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

rsocket net readerIndex 超过 writerIndex

如何解决rsocket net readerIndex 超过 writerIndex

在 .net 和 spring boot rsocket 之间的 websocket 连接上,我试图将路由标头编码到 quotes 端点,如下所示:

int routeSize = 6;
string hexValue = routeSize.ToString("X");
MetaData = hexValue + "quotes";

我不认为这是正确的。整个网络客户端代码

var client = new RSocketClient(new WebSocketTransport("ws://127.0.0.1:7000/"));
await client.ConnectAsync(new RSocketoptions()
{
    InitialRequestSize = 3,DataMimeType = "application/json",MetadataMimeType = "message/x.rsocket.routing.v0"
});

String json = {\"myQuote\":\"1234\"}
int routeSize = 6;
string hexValue = routeSize.ToString("X");
MetaData = hexValue + "quotes";

var stringclient = new RSocketClient.ForStrings(client);
await stringclient.RequestStream(json,MetaData)
    .ForEachAsync((result) =>
    {
        Console.WriteLine($"Result ===> {result}");
    });

这会产生错误

0001 Error {000}: [00000201] readerIndex(1) + length(54) exceeds writerIndex(7): UnpooledSlicedByteBuf(ridx: 1,widx: 7,cap: 7/7,unwrapped: PooledUnsafeDirectByteBuf(ridx: 0,widx: 281,cap: 281))

RSocket Net client request stream routing metadata to spring boot @MessageMapping routes 相关的是需要 C# 等效的 JavaScript String.fromCharCode(route.length) + route;

解决方法

答案是使用 default encoding 获取路由名称大小的 byte[] 作为整数 6,然后添加以字节为单位的路由名称长度,然后是路由,根据 https://github.com/rsocket/rsocket/blob/master/Extensions/Routing.md

将字符串作为 metaData 传递
byte[] intBytes = BitConverter.GetBytes(6);
string stringBytes = Encoding.Default.GetString(intBytes,1);
metaData = stringBytes + "quotes";

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。