前面我们简单的用Skynet 写了个lua服务,实现了简单的发送消息并调用输出“Hello World!”
而由于Skynet 是网络框架,所以我们这次用Skynet写一个简单的服务来监听80端口。
具体流程如下:
1、 在main文件入口内监ip为:192.168.2.5,端口为:80
2、 使用每个连接进来后新建并初始化一个服务用来处理连接相关操作。
#main.lua
local skynet = require "skynet"
local socket = require "socket"
skynet.start(function()
local id = socket.listen("192.168.2.5",80)
socket.start(id , function(fd,addr)
local cnn = skynet.newservice "network"
skynet.send(cnn,"lua","SOCKET",fd)
socket.abandon(fd)
end)
--skynet.exit()
end)
注意:这里为什么不在最后调用skynet.exit()呢?
因为start函数是非阻塞的,所以套接字的回调函数注册到skynet框架后会立刻返回;如果后面调用skynet.exit后将立刻退出main服务,从而清除当前匿名回调函数内的所有内容。
#network.lua
local skynet = require "skynet"
local socket = require "socket"
skynet.init(function()
print("init was success...")
end)
local CMD = { }
function CMD.SOCKET(fd)
socket.start(fd)
socket.write(fd,"welcome!\n\r>>")
while fd do
local buf = socket.readline(fd)
if buf and buf ~= "exit()" then
socket.write(fd,"you say: " .. buf .. "\r\n>>")
else
skynet.error("Client Closed this Connection...")
socket.close(fd)
break
end
end
end
skynet.start(function()
skynet.dispatch("lua",function(_,_,cmd,fd)
local f = assert(CMD[cmd])
if f then
f(fd)
end
end)
end)
在接收到client端的连接后,main服务将立即新建一个network服务;然后主动调用network通过lua消息将套接字fd传递到network服务内。然后我们可以看到network服务通过接收cmd命令(也就是“SOCKET”),然后进行CMD.SOCKET函数调用传参。
然后就是我们熟悉的socket的read与write了!通过一个循环我们实现了简单的echo 服务器,并且在Client端离线后我们还需要手动关闭套接字。切记在关闭套接字后还需要跳出while 循环,否则Skynet还会检测到你的服务处于deadloop.....
最后,如果对API或者各种库的用法有什么不理解的可以到Skynet的Wiki上自行查询;Wik 是中文版且写的十分详细,有兴趣的朋友可以自行研究下。