一个WebSocket Protobuf数据接收问题.

zfy3042 2017-03-13 12:41:36
好久没上CSDN了,项目上遇到一个棘手的问题了。
最近在写一个Socket程序,网上查了两天资料也没有查出个所以然来。
通过WebSocket + protobuf 与 C# Socket 服务相连.
现在webSocket能用 Protobuf 向服务器发送数据,但是服务器用 Protobuf 向 WebSocket 发送数据的时候失败并且断开了与WebSocket的连接,断开连接的主要原因我想是因为服务器发送到WebSocket的数据不是WebSocket的标准。如果用相同的算法把服务器发送到WebSocket的Protobuf数据换成字符就没有问题。

比如我一个Protobuf的byte[]长度是60,遵循WebSocket的标准,服务器发送至WebSocket的byte[]数组是[129、60、***********]
就会失败,并且服务器与WebSocket的连接会断开。

如果我把Protobuf换成一个字符串,byte[]长度同为60,遵循WebSocket的标准,服务器发送至WebSocket的byte[]的数组是[129、60、*******]。WebSocket就能接收到从服务器发送过来的字符串。

希望能在这里得到答案。谢谢各位的大力支持。
...全文
927 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
西漠以西 2017-06-06
  • 打赏
  • 举报
回复
答案在 2 楼和3楼 你就告诉我们你在服务器端用的是哪种WebSocket服务器端类库?
zheast 2017-06-06
  • 打赏
  • 举报
回复
最后有解决方案了吗?我这里也遇到了这个问题,不过最终确认是emqttd的问题,在其中一个环境里编译的emqtt是没问题的,另一个就是出现这个问题,emqtt直接拖过来替换后就好了,目前还在查找具体的emqtt编译差异在哪里,楼主有什么结果吗?
Poopaye 2017-03-13
  • 打赏
  • 举报
回复
明显你服务器自己的问题,查BUG去吧
zfy3042 2017-03-13
  • 打赏
  • 举报
回复
引用 3 楼 diaodiaop 的回复:
我觉得也是LZ思路出现了问题. 所以 既然你说到websocket那么这个socketserver 应该是那种 遵循了websocket协议的服务端..比如Fleck.DLL 而你说 你在使用的" C# Socket 服务(下称S)" 并没有说是"websocket服务端". 那么你的S可能只是"标准"的tcp/ip长连接而非websocket (当然如果你自己能够解析的话.是兼容的) 那么你websocket的client 或者使用javascript发送到的代码 你接收之后 其实跟你发送的 应该不一样. 多了一些frame之类的代码 当然你可以自己解析. 所以问题在server上面 你是要web的 还是标准的.. 如果你要web的 建议用第三方不要自己解析.
2楼跟3楼大概还没有明白我的意思,作为Server端既然在处理WebSocket的通讯,肯定有对WebSocket数据格式进行处理。不对WebSocket的数据格式进行处理,服务器也不可能跟WebSocket进行字符串的数据包正常收发。前面一直是用字符串作为数据接收的标准,但考虑项目数据传输的规范化,所以改为Protobuf来通讯。现在遇到的问题不是接收不到数据,而是改为Protobuf之后就只能收不能发了。
by_封爱 版主 2017-03-13
  • 打赏
  • 举报
回复
我觉得也是LZ思路出现了问题. 所以 既然你说到websocket那么这个socketserver 应该是那种 遵循了websocket协议的服务端..比如Fleck.DLL 而你说 你在使用的" C# Socket 服务(下称S)" 并没有说是"websocket服务端". 那么你的S可能只是"标准"的tcp/ip长连接而非websocket (当然如果你自己能够解析的话.是兼容的) 那么你websocket的client 或者使用javascript发送到的代码 你接收之后 其实跟你发送的 应该不一样. 多了一些frame之类的代码 当然你可以自己解析. 所以问题在server上面 你是要web的 还是标准的.. 如果你要web的 建议用第三方不要自己解析.
  • 打赏
  • 举报
回复
Websocket 有 client,有 server。显然你自己弄了个不成熟有 bug 的什么“Socket Server”,而没有使用成熟的 WebSocket Server 类库。
xuggzu 2017-03-13
  • 打赏
  • 举报
回复
protobuf是数据格式,服务端如果是不可控的话,也就没法调试,所以只能说你的数据格式是不是有什么不对的地方?而作为字符串发送无问题,那估计是因为服务器只把你的数据当普通字符串来处理,而未当做protobuf来解析。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧