这是一个简单的文件传输例子,使用了skynet封装的socket接口。熟悉一个框架最好的方法就是用它。git
skynet有一个“服务(service)”的概念,每一个服务相似与一个模块,完成特定的任务,启动一个服务能够使用 newservice() 或 uniqueservice()。github
首先是客户端:服务器
package.cpath = "luaclib/?.so" package.path = "lualib/?.lua;examples/?.lua" local socket = require "clientsocket" local host = "127.0.0.1" local port = 8888 local path = "/home/mick/" local filename = "cxl" local blocksize = 2 local socket_fd = socket.connect(host, port) print(path .. filename) local file = io.open(path .. filename, "rb") local len = file:seek("end") file:seek("set") local time local remain time = math.modf(len / blocksize) + 1 remain = len % blocksize socket.send(socket_fd, filename .. "\n") socket.send(socket_fd, tostring(len) .. "\n") while time > 0 do if time > 1 then time = time - 1 socket.send(socket_fd, file:read(blocksize)) else time = time - 1 socket.send(socket_fd, file:read(remain)) end end io.close(file) socket.close(socket_fd)
一、传输文件名;框架
二、传输文件大小;socket
三、传输文件内容。函数
为了方便服务器识别这三个步骤,对于前两个步骤,服务器端都使用了 readline() 函数,该函数能够以给定的分隔符为接收数据的结束标志,默认以换行符为分隔符。这里咱们就使用 '\n'(换行符) 为分隔符,能够发如今发送数据时咱们专门在数据末尾添加了换行符,接收端的readline() 函数以换行符为接收结束符,但不会存储换行符。文件的传输过程,每次按固定大小发送数据,最后一次补全剩余便可。ui
服务器端:lua
./examples/server.luaspa
local skynet = require "skynet" local socket = require "socket" local path = "/home/mick/" local filename = "" local function accept(fd, addr) print(fd, addr) socket.start(fd) local data = socket.readline(fd) local len = socket.readline(fd) len = tonumber(len) print(data, len, type(len)) filename = data .. "_copy" local file = io.open(path .. filename, "wb") while len > 0 do data = socket.readall(fd) file:write(data) len = len - #data print(len) end io.close(file) socket.close(fd) end skynet.start(function() local address = "0.0.0.0" local port = 8888 socket_listen = socket.listen(address, port) socket.start(socket_listen, accept) end)
此外,服务器端还须要启动该服务:code
local skynet = require "skynet" local max_client = 64 skynet.start(function() skynet.error("Server start") local server = skynet.newservice("server") skynet.exit() end)