问题

最近在做一个内部通讯的服务器,
用的自带的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

转载于:https://www.cnblogs.com/adoontheway/p/9623593.html

Skynet通讯遇到的奇怪问题相关推荐

  1. 20120726-分析解决“STM8L101单片机IO口模拟串口通讯发生的奇怪现象”

    近日因工作关系,需要用STM8L101F3P6这款单片机用IO口模拟串行通讯,波特率2400bps,前辈同事已经写完了程序,我需要拿来研究一下该款MCU的低功耗的情况,而在调试的过程中,发现1个奇怪的 ...

  2. Welcome to the skynet wiki!

    https://github.com/cloudwu/skynet/wiki 欢迎使用 skynet ,这是一个轻量级的为在线游戏服务器打造的框架.但从社区 Community 的反馈结果看,它也不仅 ...

  3. 神出鬼没USO:幽灵潜艇

    [海底未解之迷]神出鬼没USO:幽灵潜艇 与UFO相比,它们显得更加神秘,更加令人难以捉摸,它们到底是什么? 说起不明飞行物,可能没有几个人不知道,但是,你听说过不明潜水物这个名词吗?实际上,不明潜水 ...

  4. FPGA与Vince步进电机驱动器

    一.工程简介 1. 本工程实现的功能:用FPGA通过两个按键控制步进电机的启动和停止,硬件包括:黑金开发板.步进电机和Vince步进电机驱动器和电脑. 2.FPGA通过控制电机驱动器来控制步进电机的旋 ...

  5. 485串口测试工具软件_(案例)电脑和仪表之间485通讯的奇怪现象及解决方案

    最近网友遇到一个奇怪的现象: 台式电脑通过USB-485转换模块和管道上的一个仪表进行通讯,前面6套都很正常,第7套无法通讯.已经更换了转换模块.台式电脑,无法解决.但是用笔记本电脑就可以通讯. 台式 ...

  6. 这是什么操作?导师一作,研究生挂通讯...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文经授权转载自马军科学网博客:作者:马军(原标题:在读研究生能否做 ...

  7. 25岁Nature狂魔八连杀!曹原再次“一作+通讯”发Nature!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文来源:量子位(ID:QbitAI)丰色 梦晨.新智元公众号 曹原 ...

  8. linux shell 脚本实现tcp/upd协议通讯(重定向应用)

    前几天发了重定向以及管道相关使用方法,今天这里发些很有趣的例子.通过重定向实现基于tcp/udp协议的软件通讯. linux 设备里面有个比较特殊的文件: /dev/[tcp|upd]/host/po ...

  9. java socket 模拟im 即时通讯

    自己想了一下怎么实现,就写了,没有深究是否合理.更多处理没有写下去,例如收件人不在线,应该保存在数据库,等下一次连接的时候刷新map,再把数据发送过去,图片发送也没有做,也没有用json格式 sock ...

最新文章

  1. JS中的7种设计模式
  2. mac 安装 python mysqlclient 遇到的问题及解决方法
  3. 项目中配置log4j步骤
  4. liferay + struts2 + spring + ibatis整合开发案例
  5. php项目安装器,php服务器环境安装及项目搭建
  6. Java模拟HTTP的Get和Post请求(增强)
  7. python list排序方法_python中List的sort方法指南
  8. as 与 is 的区别
  9. 自定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,quot;掏粪男孩Gifquot;顺便再提提onWindowFocusChanged)...
  10. VMware:虚拟化技术为运营商消除隐患
  11. ThinkPHP框架学习(一)
  12. 中国的顶级黑客-小榕
  13. 获取Bootcamp 6 下载地址(mac装win10)
  14. PDF动态生僻字文本处理
  15. Python教程传送门,手把手带你学会Python!
  16. win10网络适配器不见了_win10网络适配器消失不见的解决方法
  17. ACCESS备件库管理数据库
  18. hdwiki的php架构,hdwiki框架结构简要说明
  19. 使用rsync实现文件同步
  20. 准备安装Cent OS需要的配件

热门文章

  1. VC++中字符串编码处理的一些相关问题
  2. 分布式缓存服务器设计原理
  3. Windows下更改MySQL 数据库文件存放位置
  4. [Android] TableLayout
  5. ASP.NET中 DropDownList+DetailsView(详细视图)的使用前台绑定
  6. rails笔记 cache系统
  7. matlab中if语句的用法_Excel中最常用的逻辑函数IF用法介绍
  8. 逆向与分析-WebBrowserPassView消息分析
  9. hdu5025 状态压缩广搜
  10. codeforces 229C