【Skynet】使用skynet在服务器与客户端间传输文件
2017-09-18 10:27
295 查看
这是一个简单的文件传输例子,使用了skynet封装的socket接口。熟悉一个框架最好的方法就是用它。
skynet有一个“服务(service)”的概念,每个服务类似与一个模块,完成特定的任务,启动一个服务可以使用 newservice() 或 uniqueservice()。
首先是客户端:
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)
客户端使用了 "clientsocket" 中封装的c接口,最上面两行代码分别是 c 库和 lua 库地址。代码参考自 examples/client.lua ,里面有 "clientsocket" 的使用例子。为了将文件传输到服务器,文件的传输分三个步骤:
1、传输文件名;
2、传输文件大小;
3、传输文件内容。
为了方便服务器识别这三个步骤,对于前两个步骤,服务器端都使用了 readline() 函数,该函数可以以给定的分隔符为接收数据的结束标志,默认以换行符为分隔符。这里我们就使用 '\n'(换行符) 为分隔符,可以发现在发送数据时我们专门在数据末尾添加了换行符,接收端的readline() 函数以换行符为接收结束符,但不会存储换行符。文件的传输过程,每次按固定大小发送数据,最后一次补全剩余即可。
服务器端:
./examples/server.lua
服务器端的socket的API详解见官方文档:https://github.com/cloudwu/skynet/wiki/Socket
此外,服务器端还需要启动该服务:
skynet有一个“服务(service)”的概念,每个服务类似与一个模块,完成特定的任务,启动一个服务可以使用 newservice() 或 uniqueservice()。
首先是客户端:
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)
客户端使用了 "clientsocket" 中封装的c接口,最上面两行代码分别是 c 库和 lua 库地址。代码参考自 examples/client.lua ,里面有 "clientsocket" 的使用例子。为了将文件传输到服务器,文件的传输分三个步骤:
1、传输文件名;
2、传输文件大小;
3、传输文件内容。
为了方便服务器识别这三个步骤,对于前两个步骤,服务器端都使用了 readline() 函数,该函数可以以给定的分隔符为接收数据的结束标志,默认以换行符为分隔符。这里我们就使用 '\n'(换行符) 为分隔符,可以发现在发送数据时我们专门在数据末尾添加了换行符,接收端的readline() 函数以换行符为接收结束符,但不会存储换行符。文件的传输过程,每次按固定大小发送数据,最后一次补全剩余即可。
服务器端:
./examples/server.lua
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)
服务器端的socket的API详解见官方文档:https://github.com/cloudwu/skynet/wiki/Socket
此外,服务器端还需要启动该服务:
local skynet = require "skynet" local max_client = 64 skynet.start(function() skynet.error("Server start") local server = skynet.newservice("server") skynet.exit() end)
相关文章推荐
- java客户端运用http向服务器批量传输文件
- c++服务器与android客户端进行文件传输功能的实现
- window为rsync服务器,mac为客户端传输文件实例
- 6.服务器与客户端双线程传输文件--客户端
- 网络编程之使用HttpClient上传文件的客户端和服务器
- 【TCP】使用TCP协议写一个可以上传文件的服务器和客户端。
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- Android使用HttpClient向服务器传输文件
- windows下使用Git客户端拉取服务器文件免用户名密码方法
- 使用TCP协议写一个可以上传文件的服务器和客户端。
- 【Android】Android客户端使用okhttp上传文件php服务器
- ASP.NET 中使用隐藏域实现客户端和服务器传输大量信息
- 本文示例如何使用SAP FTP Function将文件从应用服务器传输到另外一个FTP服务器上。
- Python实现的简单文件传输服务器和客户端
- 6.服务器与客户端双线程传输文件--服务器端
- Android-通过网络获取xml文件使用pull解析得到服务器中的信息(新闻客户端)
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- linux c服务器与客户端之间的文件传输
- Java Socket客户端服务器之间的文件传输
- 使用TCP协议写一个可以上传文件的服务器和客户端