问题

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

用的自带的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. 在树莓派上实现numpy的LSTM长短期记忆神经网络做图像分类,加载pytorch的模型参数,推理mnist手写数字识别

    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是LSTM识别mnist手写数字识别 训练代码在电脑上,cpu就能训练,很快的: import torch imp ...

  2. 苹果WWDC发布会总结

    今年的全球开发者大会没有让人失望.在今天的主题演讲中,苹果首次展示了备受期待的混合现实耳机,证实了过去几个月出现的许多谣言. 虽然这次苹果的 Vision Pro耳机成为了焦点,但该公司还发布了一些其 ...

  3. PQ常用模板

    //json请求 Json.Document(Web.Contents("",[Headers=[#"cookie"=tk,#"Content-Typ ...

  4. 2023安洵杯web两道WP

    Web CarelessPy 在首页提示存在eval和login的路由,在download存在任意文件下载 访问eval可以读取目录下的文件,知道/app/pycache/part.cpython-3 ...

  5. 如何优化数据warehouse的搜索和查询

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.2.1 查询优化 2.2.2 索引优化 2.2.3 数据访问优化 2.3 相关技术比较 2.3.1 SQL 2. ...

  6. Java判断101-200之间有多少个素数,并输出所有素数。

    代码如下: public static void main(String[] args) { //记录个数 int count = 0; //循环遍历 for(int i = 101;i <= ...

  7. WPF 入门笔记 - 04 - 数据绑定 - 补充内容:资源基础

    宇宙很大,生活更大,也许以后还有缘相见. --三体 该篇作为[WPF 入门笔记 - 04 - 数据绑定] - Additional Content 章节的补充内容 前言 XAML 资源概述 (WPF ...

  8. msyql的基本操作(增删改查)

    一.SQL 语法要点 1.SQL 语句不区分大小写,但是数据库表名.列名和值是否区分,依赖于具体的 DBMS 以及配置. 例如:SELECT 与 select .Select 是相同的. 2.多条 S ...

  9. Python安装time库失败?不是吧阿sir你还不知道内置模块不用下载吧

    嗨嗨,今天给python安装time库,一直报错,换源等办法都试过了 直到我看到 Python中有以下常用模块不用单独安装 random模块 sys模块 time模块 os系统操作 re正则操作 js ...

  10. Composer 镜像原理 (1) —— 初识 Composer

    相关文章 Composer 镜像原理 (1) -- 初识 Composer Composer 镜像原理 (2) -- composer.json Composer 镜像原理 (3) -- 完结篇 何为 ...