Skynet 简单的服务编写 (2)

            前面我们简单的用Skynet 写了个lua服务,实现了简单的发送消息并调用输出“Hello World!”

    而由于Skynet 是网络框架,所以我们这次用Skynet写一个简单的服务来监听80端口。

   具体流程如下:

        1、 在main文件入口内监ip为:192.168.2.5,端口为:80

        2、 使用每个连接进来后新建并初始化一个服务用来处理连接相关操作。

#main.lua

1local skynet = require "skynet" 2local socket = require "socket" 3 4 5 6skynet.start(function() 7 8 local id = socket.listen("192.168.2.5",80) 9 10 socket.start(id , function(fd,addr) 11 12 local cnn = skynet.newservice "network" 13 skynet.send(cnn,"lua","SOCKET",fd) 14 socket.abandon(fd) 15 16 end) 17 --skynet.exit() 18end)

注意:这里为什么不在最后调用skynet.exit()呢?

     因为start函数是非阻塞的,所以套接字的回调函数注册到skynet框架后会立刻返回;如果后面调用skynet.exit后将立刻退出main服务,从而清除当前匿名回调函数内的所有内容。

#network.lua

1local skynet = require "skynet" 2local socket = require "socket" 3 4skynet.init(function() 5 print("init was success...") 6end) 7 8local CMD = { } 9 10 11function CMD.SOCKET(fd) 12 13 socket.start(fd) 14 socket.write(fd,"welcome!\n\r>>") 15 16 while fd do 17 18 local buf = socket.readline(fd) 19 20 if buf and buf ~= "exit()" then 21 22 socket.write(fd,"you say: " .. buf .. "\r\n>>") 23 24 else 25 skynet.error("Client Closed this Connection...") 26 socket.close(fd) 27 break 28 end 29 end 30 31end 32 33skynet.start(function() 34 skynet.dispatch("lua",function(_,_,cmd,fd) 35 36 local f = assert(CMD[cmd]) 37 if f then 38 f(fd) 39 end 40 end) 41end)

        在接收到client端的连接后,main服务将立即新建一个network服务;然后主动调用network通过lua消息将套接字fd传递到network服务内。然后我们可以看到network服务通过接收cmd命令(也就是“SOCKET”),然后进行CMD.SOCKET函数调用传参。

        然后就是我们熟悉的socket的read与write了!通过一个循环我们实现了简单的echo 服务器,并且在Client端离线后我们还需要手动关闭套接字。切记在关闭套接字后还需要跳出while 循环,否则Skynet还会检测到你的服务处于deadloop.....

        最后,如果对API或者各种库的用法有什么不理解的可以到Skynet的Wiki上自行查询;Wik 是中文版且写的十分详细,有兴趣的朋友可以自行研究下。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移

Skynet 简单的服务编写 (2) - HelloWorld