问题

最近在做一个内部通讯的服务器,

用的自带的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通讯遇到的奇怪问题的更多相关文章

  1. 和大华电子称通讯的奇怪现象-不能关闭Socket客户端的连接

    大华电子称作为socket Server,命令自定义成02+命令+0d0a03格式.,返回给客户端的字符串也是自定义的.这就给懒人造成非常不方便. 最关键的是连接server后,disconnec没有 ...

  2. Android IOS WebRTC 音视频开发总结(六二)-- 大数据解密国外实时通讯行业开发现状

    本文主要介绍国外实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 上篇文章我们采用百度搜索指数来分 ...

  3. 转:云风skynet服务端框架研究

    转:  http://forthxu.com/blog/skynet.html skynet是云风编写的服务端底层管理框架,底层由C编写,配套lua作为脚本使用,可换python等其他脚本语言.sky ...

  4. skynet启动过程_bootstrap

    这遍摘自skynet 的wiki skynet 由一个或多个进程构成,每个进程被称为一个 skynet 节点.本文描述了 skynet 节点的启动流程. skynet 节点通过运行 skynet 主程 ...

  5. skynet是什么

         云风的skynet,定义为一个游戏服务器框架,用c + lua基于Actor模型实现.代码极其精简,c部分的代码只有三千行左右.      整个skynet框架要解决的核心问题是:把一个消息 ...

  6. Skynet:特性收集

    基于云风的 blog,收集 skynet 的特性以便将来在代码中一一验证. “ ... ” 部分节选自云风的 BLOG. 1. 基于 Erlang-Actor 模式的 C 实现 “把一个符合规范的 C ...

  7. Java利用Rxtx进行串口通讯

    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了.那么问题来了,如何进行串口通 ...

  8. 关于php-fpm通讯时没有REQUEST_METHOD的问题

    nginx是通过fastcgi协议来和php通讯的!而php-fpm就扮演了这样的角色 fastcgi协议 中文版http://blog.chinaunix.net/uid-380521-id-241 ...

  9. skynet初学

    记录下命令 git clone https://github.com/cloudwu/skynet.git sudo apt-get install autoconf sudo apt-get ins ...

  10. java socket 模拟im 即时通讯

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

随机推荐

  1. 智慧饮水系统_Android客户端

    智慧饮水系统(又名:水牛 APP) 1.介绍 该项目基于 Rfid-RC522.ESP-32 进行下位机开发,硬件模块 Rfid-RC522 主要读取用户的卡号,ESP32 单片机通过 WiFi 模块 ...

  2. 关于进程、线程、协程的概念以及Java中的应用

    进程.线程.协程 本文将从"操作系统"."Java应用"上两个角度来探究这三者的区别. 一.进程 在我本人的疑惑中,我有以下3个问题. 1.1为什么要引入进程? ...

  3. 【leetcode】# 7 整数翻转 Rust Solution

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转.示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设 ...

  4. HStore表全了解:实时入库与高效查询利器

    摘要:本文章将从使用者角度介绍HStore概念以及使用. 本文分享自华为云社区<GaussDB(DWS)HStore表讲解>,作者:大威天龙:- . HStore表简介 面对实时入库和实时 ...

  5. 2023-07-04:给定一个数组A, 把它分成两个数组B和C 对于数组A每个i位置的数来说, A[i] = B[i] + C[i] 也就是一个数字分成两份,然后各自进入B和C 要求B[i], C[i

    2023-07-04:给定一个数组A, 把它分成两个数组B和C 对于数组A每个i位置的数来说, A[i] = B[i] + C[i] 也就是一个数字分成两份,然后各自进入B和C 要求B[i], C[i ...

  6. 脚手架服务运行 报错 error:03000086:digital envelope routines::initialization error

    报错图片 解决方法: 降低版本 https://nodejs.org/zh-cn/ 安装后(安装前先卸载高版本,点击左下放大镜搜索"卸载程序" 进行卸载) 安装完成后,再次回到vu ...

  7. React中编写操作树形数据的自定义Hook

    什么是 Hook hook 即为钩子,是一种特殊的函数,它可以让你在函数式组件中使用一些 react 特性,目前在 react 中常用的 hook 有以下几类 useState: 用于在函数组件中定义 ...

  8. Python 学习路线图

    Python 学习路线图 在这个系列笔记中,我将陆续整理自己在学习 Python 编程语言及其框架的过程中留下的笔记和代码,目的是掌握如何在生产环境中利用各种领域的第三方框架来快速开发应用程序.和大多 ...

  9. Code Generate V2.0 代码生成器

    Code Generate 代码生成器 系统首页 使用说明 系统默认会根据SQL生成字段信息 className.fieldList.classComment 如下所示: 建表语句 CREATE TA ...

  10. 利用Aspose.Word对Word文件添加印章处理以及实现业务数据的替换处理

    有时候,我们在处理大量文档的时候,需要批量给Word文档添加印章处理,方便打印操作,本篇随笔介绍利用Aspose.Word对Word文件添加印章处理以及实现业务数据的替换处理. 1.利用Aspose. ...