在(一)中,介绍了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. zabbix agent被动模式配置

    zabbix agent检测分为主动(agent active)和被动(agent)两种形式,主动与被动的说法均是相对于agent来讨论的.简单说明一下主动与被动的区别如下: 主动:agent请求se ...

  2. Odoo12 重大改变

    Table of Contents 重构的功能 ORM 数据导入 库存 库存规则 MRP 多步路线 新功能 IoT     Odoo12 预计 2018/10 在 Odoo experience 20 ...

  3. LeetCode-Minimum Window Substring -- 窗口问题

    题目描述 Given a string S and a string T, find the minimum window in S which will contain all the charac ...

  4. JavaScript Array splice函数

    // 原来的数组 var array = ["one", "two", "four"]; // splice(position, numbe ...

  5. java 字符深入知识,待整理

    '编',"编",  为什么获取到的字节数组长度不一样 http://www.cnblogs.com/yongdaimi/p/5899328.html Unicode 官网 http ...

  6. MySQL5.5中文支持

    1. /etc/my.cnf.d/client.cnf [client] #password = [your_password] port = 3306 socket = /tmp/mysql.soc ...

  7. LeetCode :: Sum Root to Leaf Numbers [tree、dfs]

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  8. shell去掉后缀方法

    #!/bin/bash olddir=/home/img/luimg newdir=/home/img/luimg/thumb while read line do if [ -f $olddir${ ...

  9. BFS和DFS的java实现

    <pre name="code" class="java"> import java.util.HashMap; import java.util. ...

  10. Python学习笔记(一)三步走安装pip

    pip是用来方便地管理Python的第三方包的,由于此前玩Python仅仅是浅尝辄止,用的是python(x,y),但是这里并不代表你想用什么包都能从里面找到的,所以我把python(x,y)卸了,然 ...