前面我们简单的用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 是中文版且写的十分详细,有兴趣的朋友可以自行研究下。