编译lua源码-skynet框架中如何使用socket+protobuf

介绍:

如果我们想以长连接的形式改进skynet服务器和客户端之间的连接,并选择Google的Protobuf来定制我们的网络合约,那么接下来我们要解决的问题就是:如何在skynet框架中使用socket+原型缓冲区。

蜜蜂

几种常用的skynet套接字:

*   输出错误信息:          skynet.error(...)
*   获取本地服务句柄方式:   skynet.localname(...)
*   设置定时器方式:        skynet.timeout(...)
*   skynet强制退出方式:    skyname.abort()
*   服务开始方式:          skynet.start(...)
*   服务注销方式:          skynet.exit()
*   发送原始文本消息方式:   skynet.core.send(...)

protobuf在skynet中的使用:

由于lua版本的protobuf支持存在一些缺陷,为了防止踩坑,这里直接使用云峰博客推荐的pbc动态proto解析库。

下载:

下载pbc:和下载skynet源码一样编译lua源码,通过git将pbc源码clone到本地:

bogon:project linshuhe$ git clone https://github.com/cloudwu/pbc.git
Cloning into 'pbc'...
remote: Counting objects: 1156, done.
remote: Total 1156 (delta 0), reused 0 (delta 0), pack-reused 1156
Receiving objects: 100% (1156/1156), 302.95 KiB | 310.00 KiB/s, done.
Resolving deltas: 100% (682/682), done.
Checking connectivity... done.

编译并合并到项目中:

项目编译:

可以在pbc根目录下执行make命令来编译工程:

linsh@ubuntu:/application/pbc$ sudo make
cd build && ar rc libpbc.a ../build/o/context.o ../build/o/varint.o ../build/o/array.o ../build/o/pattern.o ../build/o/register.o ../build/o/proto.o ../build/o/map.o ../build/o/alloc.o ../build/o/rmessage.o ../build/o/wmessage.o ../build/o/bootstrap.o ../build/o/stringpool.o ../build/o/decode.o
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o addressbook ../test/addressbook.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o pattern ../test/pattern.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o pbc ../test/pbc.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o float ../test/float.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o map ../test/map.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o test ../test/test.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o decode ../test/decode.c -lpbc
protoc -obuild/addressbook.pb test/addressbook.proto
protoc -obuild/descriptor.pb test/descriptor.proto
protoc -obuild/float.pb test/float.proto
protoc -obuild/test.pb test/test.proto

编译lua源码-skynet框架中如何使用socket+protobuf

如果编译结果报错:

make: protoc:命令未找到
make: *** [build/addressbook.pb] 错误 127

这是因为当前环境还没有安装protobuf。 安装步骤如下:

安装命令:

sudo apt-get install protobuf-c-compiler protobuf-compiler 1

查询版本验证完成:

linsh@ubuntu:/application/pbc$ protoc --version libprotoc 2.5.0 12

我想给大家推荐一个关于天网项目实战的训练营。 现在可以免费申请考试。 (后台私信“天网”获取地址)讲座内容:

多核并发编程

消息队列.线程池

演员消息调度

网络模块实现

时间轮定时器的实现

lua/c/接口编程

编译lua源码-skynet框架中如何使用socket+protobuf

天网编程要点

demo展示了actor编程思维

更多skynet及c/c++ linux服务器开发资料加群:812855908免费分发!

(包括C/C++、Linux、golang技术、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、流媒体、CDN、P2P、K8S、Docker、TCP/IP、协程、DPDK、ffmpeg等)

工具编译:

使用终端进入pbc项目pbc/binding/lua53目录,编译protobuf.so:

cd pbc/binding/lua
sudo make

如果编译成功,将protobuf.so放到配置文件中lua_cpath项配置的目录下,将protobuf.lua放到配置文件中lua_path项配置的目录下,然后就可以调用库方法了原型缓冲区。 我当前项目中这两项的配置如下:

lua_path = root.."lualib/?.lua;"..root.."lualib/?/init.lua"
lua_cpath = root .. "luaclib/?.so"

那么联通文件命令可以如下:

sudo cp protobuf.so /application/skynet/luaclib 
sudo cp protobuf.lua /application/skynet/lualib

编译错误:

在pbc/binding/lua目录下编译,出现如下错误:

编译lua源码-skynet框架中如何使用socket+protobuf

linsh@ubuntu:/application/pbc/binding/lua$ sudo make
gcc -O2 -fPIC -Wall -shared -o protobuf.so -I../.. -I/usr/local/include -L../../build pbc-lua.c -lpbc
pbc-lua.c:4:17: fatal error: lua.h: 没有那个文件或目录
#include "lua.h"
                ^
compilation terminated.
make: *** [protobuf.so] 错误 1

错误原因:由于这里没有安装lua5.3,所以不能是lua5.2或者lua5.1等低版本,否则会报错。 因为pbc使用了lua_rotate,它是lua5.3的新类型。

解决方法:安装lua5.3即可解决,步骤如下:

去lua官网下载lua5.3的安装包:

lua-5.3.0.tar.gz

您还可以使用命令行下载工具axel:

linsh@ubuntu:/application/pbc/binding$ sudo axel http://www.lua.org/ftp/lua-5.3.0.tar.gz
初始化下载: http://www.lua.org/ftp/lua-5.3.0.tar.gz
File size: 278045 bytes
打开输出文件 lua-5.3.0.tar.gz
开始下载
[  0%]  .......... .......... .......... .......... ..........  [  53.8KB/s]
[ 18%]  .......... .......... .......... .......... ..........  [  73.1KB/s]
[ 36%]  .......... .......... .......... .......... ....
连接 3 结束
        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,......  [  96.9KB/s]
[ 55%]  .......... .......... .......... .......... ..........  [  92.5KB/s]
[ 73%]  .......... .......... .......... ......
连接 0 结束
        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,.... ........
连接 1 结束
        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,..  [  80.5KB/s]
[ 92%]  .......... .......... .
271.5 千字节 已下载,用时 6 秒。(43.52 千字节/秒)

使用压缩包解压安装:

首先将下载的文件复制到usr/local/src目录下

sudo cp lua-5.3.0.tar.gz /usr/local/src

依次执行以下命令:

sudo tar zxf lua-5.3.0.tar.gz 
cd lua-5.3.0/ 
sudo make linux test

创建软链接,以便当前环境下任何地方都可以使用lua:

sudo ln -s /usr/local/src/lua-5.3.0/src/lua /usr/bin/lua

测试软连接是否成功:

linsh@ubuntu:/usr/local/src/lua-5.3.0/src$ lua
程序 'lua' 已包含在下列软件包中:
* lua5.2
* lua5.1
* lua50
请尝试:sudo apt-get install 

我也出现了这个问题,最后发现原因是因为我在添加软链接的时候把第一个地址(lua安装地址)/usr/local/src/lua-5.3.0/src/lua写入了/usr/ local/src/lua5.3.0/src/lua,解决问题可以看到:

linsh@ubuntu:/usr/bin$ lua
Lua 5.3.0  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> 

修改pbc/binding/lua/Makefile中lua库的地址配置信息LUADIR为当前lua安装的地址:

LUADIR = /usr/local/src/lua-5.3.0/src 1

再次运行编译命令,查询当前目录下文件的变化:

linsh@ubuntu:/application/pbc/binding/lua$ sudo make
gcc -O2 -fPIC -Wall -shared -o protobuf.so -I../.. -I/usr/local/src/lua-5.3.0/src -L../../build pbc-lua.c -lpbc
linsh@ubuntu:/application/pbc/binding/lua$ ls
build_ios.sh  Makefile  parser.lua  pbc-lua.c  protobuf.lua  protobuf.so  README.md  test2.lua  test.lua  testparser.lua

测试:

首先在项目根目录下创建一个protos文件夹用于存放合约文件,并创建一个Person.proto合约文件,内容如下:

sudo mkdir protos 
cd protos 
sudo vi Person.proto 

协议文件内容如下:

package cs; 
message Person { 
required string name = 1; 
required int32 id = 2; // Unique ID number for this person. 
optional string email = 3; 
enum PhoneType { 
MOBILE = 0; 
HOME = 1; 
WORK = 2; 
} 
message PhoneNumber { 
required string number = 1; 
optional PhoneType type = 2 [default = HOME]; 
} 
repeated PhoneNumber phone = 4; 
} 

将合约文件转换为.pb格式:

编译lua源码-skynet框架中如何使用socket+protobuf

linsh@ubuntu:/application/skynet/protos$ sudo protoc --descriptor_set_out Person.pb Person.proto 
linsh@ubuntu:/application/skynet/protos$ ls 
Person.pb Person.proto 

目录下有对应的.pb文件。

在lua中注册对应的合约文件:

引入protobuf.lua:

local pb = require "protobuf" 1

注册.proto合约文件对应的.pb文件有两种方式:

方法一:直接注册文件:

pb.register_file "Person.pb" 

方法二:通过io读取文件,然后获取文本内容进行注册:

file = io.open("Person.pb","rb") 
buffer = file:read "*a" 
file:close() 
pb.register(buffer) 

编码和解码是通过encode和decode两个socket实现的编译lua源码,完整的测试脚本:

 local skynet = require "skynet" 
local protobuf = require "protobuf" 
skynet.start(function() 
protobuf.register_file "./protos/Person.pb" 
skynet.error("注册协议文件:Person.pb") 
stringbuffer = protobuf.encode("cs.Person", { 
name = "linsh", 
id = 1,
 }) 
local data = protobuf.decode("cs.Person",stringbuffer) 
skynet.error("数据编码:name="..data.name..",id="..data.id) 
end) 
``` 

如果注册的合约文件依赖于其他合约文件,则必须先注册依赖的合约文件,否则会出现注册失败的错误

运行正确结果:

[:0100000c] 注册协议文件:Person.pb
[:0100000c] 数据编码:name=linsh,id=1

另外,云峰还定制了一套合约格式sproto,据说比protobuf更简单。

俗话说:“多才多艺”linux源码编译,即使你很少编译安装PHP等软件,而作为一名程序员,你仍然需要掌握这一点。 如果以后转入运维怎么办? 接下来就跟随小编一起来了解一下PHP编译安装吧!

php

环境及原材料:centos7.6+php7.2+swoole4.3(linux系统环境自行安装)

1.源码编译安装PHP7.2

第一步:下载PHP7.2源码(最好从PHP官网下载)

命令:wget

下载php源码包

php2.1源码包

第二步:解压下载的PHP源码包

命令:tarxvfphp-7.2.1.tar.gz

解压后的php文件

第三步:进入PHP源代码目录,开始编译步骤

在cdphp-7.2.1中,查看configure文件,该文件是编译前指定具体配置的命令,下面会用到

php源码包中的文件

编译之前可以使用./configure--help看看可以进行哪些配置

./配置--帮助

编译分为几个步骤:

1、编译前配置,这里配置php安装目录(前面可以添加参数配置其他配置项)

命令:./config --prefix=/usr/local/php21

./configure --prefix=/usr/local/php21

配置时检测结果

2.编译源码并使用make命令

编译源码make

编译成功

3、使用maketest命令排除故障

maketest故障排除流程

4. makeinstall 将编译好的文件安装到系统中

makeinstall 安装编译文件

5.将php.ini-development文件复制到/usr/local/php21/lib

命令:cpphp.ini-development/usr/local/php21/lib/php.ini

php.ini 文件

这样,PHP源码的编译安装就完成了,进入安装目录查看,cd /usr/local,看到php21就是安装的PHP

PHP安装目录

拿出来我们验证一下是否安装成功,命令 /usr/local/php21/bin/php -v

查看PHP版本,安装成功

可以将安装好的php添加到环境变量中,然后命令行使用就很方便了; 编辑vim/etc/profile文件linux源码编译,在文件末尾添加aliasphp21='/usr/local/php21/bin/php',保存退出,执行source/etc/profile即可生效。 然后直接执行php21 -v命令,如右图,说明成功:

添加环境变量php21-v后

至此,PHP的源码编译安装就已经完成了,接下来我们在此基础上编译安装swoole4。

2.源码编译安装swoole4

当然,编译安装和安装php类似,只是中间需要多做一步,使用php的config进行配置和安装。 我们上去看看

第一步:下载swoole4源码

命令 wget

下载swoole源码

swoole源码包

第二步:解压swoole源码包

命令:tarxzvfv4.3.5.tar.gz

swoole源码解压包

swoole源代码文件

第三步:在swoole源码目录下使用phpize生成并编译swoole扩展配置文件

命令:/usr/local/php21/bin/phpize(该命令是PHP专门用来安装扩展的)

phpize 生成配置

phpize后的源代码文件

现在源代码文件中已经包含了configure文件,接下来的安装就和正常编译基本一样了。

第四步:编译安装swoole

1.加载php配置php-config

命令:./configure --with-php-config=/usr/local/php21/bin/php-config

./configure --with-php-config

2.make编译源代码

make编译源代码

编译结果

3.maketest故障排除

进行测试故障排除

4. makeinstall 将编译好的文件安装到系统中

makeinstall安装结果

进入/usr/local/php21/lib/php/extensions/no-debug-non-zts-20170718/目录查看生成的swoole.so文件,swoole编译安装成功

swoole.so 扩展

5.编辑php.ini文件,添加一行extension=swoole.so

添加扩展名=swoole.so

6.验证swoole安装成功,php21 -m 检查扩展中是否有swoole

php -m 检查swoole是否加载成功

至此,我们的swoole源码编译安装成功。 接下来我们可以写一个程序来看看php+swoole的运行情况。

3.php+swoole程序验证

1.新建php文件vimhttpServer.php,编译以下代码,保存退出。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 编译lua源码-skynet框架中如何使用socket+protobuf https://www.wkzy.net/game/126961.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务