【Skynet】使用skynet在服务器与客户端间传输文件
来源:互联网 发布:手机淘宝怎样删除订单 编辑:程序博客网 时间:2024/04/30 21:45
这是一个简单的文件传输例子,使用了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 = 8888local path = "/home/mick/"local filename = "cxl"local blocksize = 2local 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 timelocal remaintime = math.modf(len / blocksize) + 1remain = len % blocksizesocket.send(socket_fd, filename .. "\n")socket.send(socket_fd, tostring(len) .. "\n")while time > 0 doif time > 1 thentime = time - 1socket.send(socket_fd, file:read(blocksize))elsetime = time - 1socket.send(socket_fd, file:read(remain))endendio.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 dodata = socket.readall(fd)file:write(data)len = len - #dataprint(len)endio.close(file)socket.close(fd)endskynet.start(function()local address = "0.0.0.0"local port = 8888socket_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 = 64skynet.start(function()skynet.error("Server start")local server = skynet.newservice("server")skynet.exit()end)
阅读全文
0 0
- 【Skynet】使用skynet在服务器与客户端间传输文件
- skynet
- Skynet
- skynet
- skynet框架 使用心得
- skynet框架 使用心得
- skynet框架 使用心得
- AWS配置使用 SKYNET
- skynet使用笔记
- Skynet服务器框架(五) 使用pbc(protobuf)
- 【服务器架构】Skynet 设计综述
- skynet源代码文件功能简介
- 【Skynet】Sproto初学与应用
- 【Skynet】socket与多服务
- skynet 控制台管理使用技巧
- skynet 控制台管理使用技巧
- skynet 控制台管理使用技巧
- skynet 控制台管理使用技巧
- uWSGI + Nginx配置Django项目(一)
- Android Service ANR
- ICO--代币分类
- Nginx实现负载均衡
- Airflow安装部署
- 【Skynet】使用skynet在服务器与客户端间传输文件
- HTML表单Form转化为JSON-yellowcong
- oracle中创建序列,同义词
- Spring事务传播特性的浅析——事务方法嵌套调用
- 编程命名规则
- python统计代码空行与注释
- 智能小车32:安装超声波测距
- Java多线程(二):线程同步synchronized和volatile
- Open-drain与Totem-pole(开漏与推挽电路)