如何解决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 举报,一经查实,本站将立刻删除。