在(一)中,介绍了c对lua层的拓展,这边主要写lua层的网络部分,目标是实现RPC调用,实现主要是三部分:

1通信协议(消息的序列化和反序列化)

rpc调用主要信息包括方法名,方法参数,设计的通信协议如下:
字节长度(4字节)|方法名|方法参数
因为方法参数是由1个表序列化来的,必然以’{‘开头,所以可以区分方法名和方法参数.
local data=_encodefuncname, funcarg)
local funcname, funcarg=_decode(data)
以上两个方法分别对应消息的序列化,反序列化
实际使用可以优化,怎么优化可以自己想想(主要优化相同的长字符串)

2发送消息

发送消息主要是对单个连接(net)发送和广播。举例,对某个玩家告诉他的vip升级了,形式如下:

player.vip{lv=8}

还需要对所有的在线用户广播XXX升级到了vip8,形式如下:

World.vip{Player='XXX', lv=8}

实现主要是借助lua的metatable,核心的相关代码如下:

_callout(PLAYER, function(player,func, args)

  local data=_encode(func, args)

  net:send(#data+4), net:send(data)

end)

_callout(WORLD, function(world, func, args)

  local data=_encode(func, args)

  for _, net in nets do

    net:send(#data+4), net:send(data)

  end

end)

其中player的metatable是PLAYERworld的metatable是WORLD,核心方法是_callout,可以参考callout.lua

3接收消息

从网络接收到了消息之后,不是立即处理,而且是把它放在一个队列里面,等网络循环完了,再处理消息,原因可以自己想下

一般使用如下:

_callin(net, data)

_callin 实现思路如下:

queue.push({net, _decode(data)})

消息的处理借助lua实现的1个事件机制,事件机制是真个服务器实现中最精彩的部分,下一篇详细介绍

页游手游服务器(三)lua网络层的更多相关文章

  1. 页游手游服务器(一)c实现拓展lua网络

    把工作几年服务器相关的部分内容,通过服务器解决方案,做一次总结.整个实现的主体是lua脚本,lua实现主要缺少的两大块:1网络部分2数据库部分这两部分必须通过c/c++做扩展先来做net,主要是服务器 ...

  2. 页游手游服务器(二)c支持mysql

    上一篇说的是liua的net拓展,这一篇说lua的sql拓展,准确说是mysql拓展,这里推荐下postgre,比mysql好用,支持数组,各种好,不过腾讯平台不支持,所以你的公司要和腾讯合作,掂量下 ...

  3. 页游手游服务器(五)sql缓存层

    sql的通用缓存,是实现最麻烦的一部分,对于查询结果的缓存,主要有如下的结构来缓存: cache tablename--player statement--select * from player w ...

  4. Unity3D手游开发实践

    <腾讯桌球:客户端总结> 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: 架构设计 原生插件/ ...

  5. (转)Unity3D手游开发实践

    作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). (转)& ...

  6. distri.lua重写开源手游服务器框架Survive

    Survive之前采用的是C+lua的设计方式,其中网关服务器全部由C编写,其余服务全部是C框架运行lua回调函数的方式编写游戏逻辑. 鉴于一般的手游对服务器端的压力不会太大,便将Survive用di ...

  7. SLG手游Java服务器的设计与开发——架构分析

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  8. 手游为什么要热更新,C#为什么不能热更新,LUA为什么可以

    热更新是什么?简单的说就是打补丁,只补需要部分,不用重个游戏包重打上传 热更新问题的本质是代码更新而不是资源更新,为什么呢? 大型手游都是将补丁资源放在专门的WEB服务器上,游戏启动时动态下载并放入到 ...

  9. SLG手游Java服务器的设计与开发——数据管理

    文章版权归腾讯GAD所有,禁止匿名转载:禁止商业使用:禁止个人使用. 一.前言 上文介绍了我们的SLG手游的服务器架构设计以及网络通信部分,本文介绍数据管理部分,在数据存储方面,我选择了Mysql.M ...

随机推荐

  1. Elasticsearch教程(一),全程直播(小白级别)

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...

  2. 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT-4 获取本机名称和网卡名称

    使用命令FB_GetHostName来获取本机名称,返回的是一个字符串   使用命令FB_GetAdaptersInfo获取网卡信息(注意采集到的是一个非常复杂的类型,本身是一个数组,数组的每个元素又 ...

  3. react-native 组件默认属性(defaultProps) 及 属性类型验证(PropTypes)

    1.所有的属性类型 2.代码 import PropTypes from 'prop-types'; type Props = {}; export default class App extends ...

  4. Oracle 为表空间增加数据文件

    dba权限检查下 select tablespace_name, file_id, file_name, ),) total_space from dba_data_files order by ta ...

  5. Nginx 限制单个IP的并发连接数及对每个连接速度(限速)

    使用Nginx限制单个IP的并发连接数能够减少一些采集程序或者DDOS的攻击. 再lnmp的nginx配置中已经添加了部分代码,但是是注释掉的,可以编辑/usr/local/nginx/conf/ng ...

  6. windows远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可

    远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可. (也可以用 mstsc /admin) 可以在运行里使用mstsc /console /v:IP:远程端口即可强制登录; ...

  7. 遍历list,字典

    private void Form1_Load(object sender, EventArgs e) { List<int> ids = new List<int>(); i ...

  8. 【Hadoop基础教程】2、Hadoop之单机模式搭建(转)

    单机模式所需要的系统资源是最少的,这种安装模式下,Hadoop的core-site.xml.mapred-site.xml.hdfs-site.xml配置文件均为空.默认情况下,官方hadoop-1. ...

  9. JavaScript事件使用指南

    事件流 事件流描述的是从页面中接收事件的顺序,IE和Netscape提出来差不多完全相反的事件流的概念,IE事件流是事件冒泡流,Netscape事件流是事件捕获流. 事件冒泡 IE的事件流叫做事件冒泡 ...

  10. jsp 页面导出excel时字符串数字变成科学计数法的解决方法

    web导出excel数据格式化 原文地址:http://www.cnblogs.com/myaspnet/archive/2011/05/06/2038490.html   当我们把web页面上的数据 ...