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 ...
随机推荐
- 1.3 Metasploit 生成SSL加密载荷
在本节中,我们将介绍如何通过使用Metasploit生成加密载荷,以隐藏网络特征.前一章节我们已经通过Metasploit生成了一段明文的ShellCode,但明文的网络传输存在安全隐患,因此本节将介 ...
- Cisco命令中login和login local的区别
login是开启远程登录密码验证,login local不但要求密码,还要求提供用户名 如果同时设置login和login local,login local有效 (config-line)#line ...
- 暴力密码破解工具——Hydra
Hydra简介 hydra中文意思为九头蛇,它是黑客组织thc开发一款开源暴力密码破解工具,可以在线破解多种密码,支持Windows Linux MAC系统安装使用(Kali Linux自带), 支持 ...
- ASP.Net Core 项目部署
安装环境 部署环境有两种: .Net Core SDK 包含所有运行时和程序开发包,用于程序开发使用,体积相对较大. .Net Core Runtime 仅用于程序运行,不包含开发包,体积小. 注:部 ...
- 2022蓝桥杯B组(java)版
2022蓝桥杯b组 A题 import java.math.BigInteger; public class A { public static void main(String[] args) { ...
- 本地数据local storage和session storage
随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据, HTML5规范提出了相关解决方案. 本地存储特性 1.数据存储在用户浏览器 ...
- 查询mysql数据库目前有哪些链接 具体ip及数量
SELECT substring_index(host, ':',1) AS host_name,state,count(*) FROM information_schema.processlist ...
- 基于GPT搭建私有知识库聊天机器人(五)函数调用
文章链接: 基于GPT搭建私有知识库聊天机器人(一)实现原理 基于GPT搭建私有知识库聊天机器人(二)环境安装 基于GPT搭建私有知识库聊天机器人(三)向量数据训练 基于GPT搭建私有知识库聊天机器人 ...
- hexo博客yilia主题_缺失模块_解决方案
hexo博客yilia主题,左侧栏目有一个全部文章的按钮,刚开始开始报错缺失模块,如下图: 我解决了这个问题着实不容易饶了弯路,但是跟着提示步骤,其实很简单,走起: 1.查看node版本 win键+R ...
- postgresql + timescaledb离线安装笔记(zabbix数据库准备工作)
实验环境 操作系统:centos 7.6 PostgreSQL:14.6 timescaledb:2.8.1 网络:本地无网络 1 编译源码安装 1.1 准备工作 useradd postgres m ...