Skynet通讯遇到的奇怪问题
问题
最近在做一个内部通讯的服务器,
用的自带的gateserver和socketchannel做通讯,
在使用skynet.unpack或者string.unpack("XXXX",xxxx)的时候,
偶尔会出现
lua JSON parser does not support UTF-16 or UTF-32
之类的问题。
调查过程
调查的时候,
发现出问题的时候,
信息的长度会多出2个字节出来,
所以调用 ** string.unpack** 或者 skynet.unpack的时候,
无法解出其中的字符串,
一个返回nil,
一个返回原字符串内容,
导致 cjson.decode 的时候报错了
解决过程
这个问题纠缠了很久,
总是时有时无的出现,
一开始还以为是编码问题,
因为有2个协议特别容易出问题,
而这两个协议查理数据库返回数据的,
查看项目的lua文件编码:UTF8
查看数据库编码规则:utf8mb4。
调查了一下是不会有问题的。
由于是通过socketchannel的response进行回传参数解析的,
获取返回结果使用的是 sock:readline(),
还以为是系统原因,
在S端将分隔符改为 "\r\n",
sock:readline("\r\n"),
试验证明,无效。
然后今天下午突然想,
一个 byte 一个 byte 的来读可好,
然后先读了个 ** >I2 ** 也就是数据长度,
长度没有问题的话就接着往下读,
有问题的话返回 ** 0,false**,
直到把完成的数据读出来,
然后一个一个的打印出来。
重启启动发现,
bug没有了。
结果
bug没有之后,
我发现一个问题,
sock 会读出 >I2 为 *** 0 *** 的一条消息,
这个消息是会占用2个字节的,
然后,
这个消息居然会每10秒钟触发一次,
这个难道是 gateserver 默认的 heartbeat来让C端 keep alive的么,【需要进一步调查】
而那些出错的 bug 是因为通过 readline 读取的单条消息会在第一个10s的时候和方式的消息进行合并,
导致那条出错的消息多出了2个字节所致。
至此,基本了解了这个bug
2018-9-22补:
最近看教程看到的socketchannel
Skynet通讯遇到的奇怪问题的更多相关文章
- 和大华电子称通讯的奇怪现象-不能关闭Socket客户端的连接
大华电子称作为socket Server,命令自定义成02+命令+0d0a03格式.,返回给客户端的字符串也是自定义的.这就给懒人造成非常不方便. 最关键的是连接server后,disconnec没有 ...
- Android IOS WebRTC 音视频开发总结(六二)-- 大数据解密国外实时通讯行业开发现状
本文主要介绍国外实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 上篇文章我们采用百度搜索指数来分 ...
- 转:云风skynet服务端框架研究
转: http://forthxu.com/blog/skynet.html skynet是云风编写的服务端底层管理框架,底层由C编写,配套lua作为脚本使用,可换python等其他脚本语言.sky ...
- skynet启动过程_bootstrap
这遍摘自skynet 的wiki skynet 由一个或多个进程构成,每个进程被称为一个 skynet 节点.本文描述了 skynet 节点的启动流程. skynet 节点通过运行 skynet 主程 ...
- skynet是什么
云风的skynet,定义为一个游戏服务器框架,用c + lua基于Actor模型实现.代码极其精简,c部分的代码只有三千行左右. 整个skynet框架要解决的核心问题是:把一个消息 ...
- Skynet:特性收集
基于云风的 blog,收集 skynet 的特性以便将来在代码中一一验证. “ ... ” 部分节选自云风的 BLOG. 1. 基于 Erlang-Actor 模式的 C 实现 “把一个符合规范的 C ...
- Java利用Rxtx进行串口通讯
最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了.那么问题来了,如何进行串口通 ...
- 关于php-fpm通讯时没有REQUEST_METHOD的问题
nginx是通过fastcgi协议来和php通讯的!而php-fpm就扮演了这样的角色 fastcgi协议 中文版http://blog.chinaunix.net/uid-380521-id-241 ...
- skynet初学
记录下命令 git clone https://github.com/cloudwu/skynet.git sudo apt-get install autoconf sudo apt-get ins ...
- java socket 模拟im 即时通讯
自己想了一下怎么实现,就写了,没有深究是否合理.更多处理没有写下去,例如收件人不在线,应该保存在数据库,等下一次连接的时候刷新map,再把数据发送过去,图片发送也没有做,也没有用json格式 sock ...
随机推荐
- Bio+IT 爱好者社区,欢迎你!
生物信息学是一个跨学科的大领域,一直以来,做生物信息分析的工程师都需要跟 IT 打交道. 现实问题是,有很多生物学.医学.遗传学背景的 Bio 人对生物领域拥有非常专业的知识经验,而对 IT 领域知之 ...
- CentOS Linux 7 配置 nginx 支持 CGI
Nginx 本身不能执行外部程序,Nginx 处理 PHP 是通过 PHP 的 fastcgi 管理器(php-fpm)进行处理,然后 nginx 再将结果返回给用户:所以如果我们需要通过 cgi 程 ...
- uniapp主题切换功能的第二种实现方式(scss变量+require)
在上一篇 "uniapp主题切换功能的第一种实现方式(scss变量+vuex)" 中介绍了第一种如何切换主题,但我们总结出一些不好的地方,例如扩展性不强,维护起来也困难等等,那么接 ...
- .Net7矢量化的性能优化
前言 矢量化是性能优化的重要技术,也是寄托硬件层面的优化技术.本篇来看下. 概括 一:矢量化支持的问题: 矢量化的System.Runtime.Intrinsics.X86.Sse2.MoveMask ...
- Qt6使用SeriaPortl包
简介: 最近使用Qt6.0开发一个自己串口小工具的时候,遇到了没有QtSerialPort包的情况,一番折腾终于找到了解决方案... 一. 在系统自带的卸载更改程序中,找到Qt,点击卸载 二. 点击添 ...
- 一次Mybaits查询的源码分析
很好奇Mybaits是怎么将xml和mapper对应起来的,用一段比较简单的demo去debug追踪一下源码看看 先用xml配置的方式,看懂了再去看注解的方式是怎么实现的 获取Mapper Mybai ...
- CoFiltering:BestPracticesandTechniquesinTextGeneration
目录 Co-Filtering: Best Practices and Techniques in Text Generation Introduction: Text generation has ...
- 温故知新,signalR、RSA加密、ConcurrentQueue队列
这是一个用户密码异步加解密的Demo,包含了RSA非对称加密,ConcurrentQueue线程安全队列使用,signalR实时推送加解密信息等内容. 说在前面的话 距离上次更新已然快过去一年了,这中 ...
- Unity 制作KinematicCharacterController
本篇博客为游戏开发记录,博主只是想自己做个移动组件给自己做游戏用,此间产生的一些经验也做一个分享. 简介 为了在3D世界中自由的控制我们的角色,引擎一般会提供一些基础的移动组件,上层用户做提供一些每帧 ...
- matlab转C++——C++中的矩阵运算和矩阵型函数
最近接到一个委托,把matlab代码转译为c++语言,看看能不能提高运行效率. matlab虽然本身具有将程序转化为C++的app库,但是对代码格式有严格的要求: 变量使用之前需要对变量类型和空间大小 ...