服务端:
#main
1local skynet = require "skynet" 2 3local function action() 4 skynet.uniqueservice("debug_console",8000) 5 skynet.uniqueservice "watchdog" 6 skynet.exit() 7end 8 9skynet.start(action)
#wachdog
1local skynet = require "skynet" 2local socket = require "socket" 3 4 5skynet.start(function() 6 local id = socket.listen("",8080,1024) 7 socket.start(id,function(fd,addr) 8 local agent = skynet.newservice "agent" 9 skynet.send(agent,"lua","SOCKET",fd,addr) 10 socket.abandon(fd) 11 end) 12end)
#agent
1local skynet = require "skynet" 2local socket = require "socket" 3 4 5local CMD = {} 6-- 模拟信号矢量 7local signal = true 8-- 心跳超时次数 9local timeval = 0 10 11--解包函数 12local function unpack_data(package) 13 -- 收到的包总长度 14 local total_len = string.len(package) 15 print("总大小为:",total_len) 16 -- 解包格式 17 local fmt = string.format(">Ic%d",string.len(package) - string.packsize(">I")) 18 19 --解包后的数组 20 local tmp_pkg = {} 21 while 1 do 22 -- 开始解包 23 local endpoint, subpkg, _ = string.unpack(fmt,package) 24 -- 截断字符串 25 tmp_data = subpkg:sub(1,endpoint) 26 -- 插入到临时表中 27 table.insert(tmp_pkg,tmp_data) 28 -- 得到剩余包的内容 29 --package = string.gsub(package,string.sub(package,begin,endpoint + string.packsize(">I")),"") 30 package = package:sub(1+endpoint+string.packsize(">I"),#package) 31 -- 重置fmt格式 32 fmt = string.format(">Ic%d",package:len() - string.packsize(">I")) 33 34 if #package <= 0 then 35 break 36 end 37 end 38 39 --打印一下看是否解包正确 40 for k,v in pairs(tmp_pkg) do 41 print(k,v) 42 end 43 return tmp_pkg 44end 45 46 47local function heartbeat(fd) 48 -- 15秒后无回应即断开客户端回收资源 49 while 1 do 50 if timeval >=5 then 51 break 52 end 53 skynet.sleep(300) 54 timeval = timeval + 1 55 end 56 socket.close(fd) 57 skynet.error("客户端链接超时.....") 58 skynet.exit() 59end 60 61function CMD.SOCKET(fd,addr) 62 socket.start(fd) 63 --skynet.fork(heartbeat,fd) 64 while true do 65 66 local data = socket.read(fd) 67 if not data then 68 --读到EOF表示关闭了套接字。 69 socket.close(fd) 70 break 71 end 72 timeval = 0 73 profile.start() 74 local pb_arr = unpack_data(data) 75 local time = profile.stop() 76 skynet.error(time) 77 78 end 79 skynet.error("[",os.date("%c",os.time()),"],","client ",addr,"close this session.") 80 skynet.exit() 81end 82 83 84 85skynet.start(function() 86 skynet.dispatch("lua",function(_,_,cmd,...) 87 local func = assert(CMD[cmd]) 88 if type(func) == "function" then 89 func(...) 90 end 91 92 end) 93 94end)
客户端:
#main.py
1#!/usr/bin/python2.7 2#encoding:utf-8 3from gevent import socket 4import struct,message_pb2 5 6s = socket.socket() 7s.connect(("192.168.40.2",8080)) 8while 1: 9 data = raw_input("Please input Something:\n>>") 10 pkg1 = struct.pack(">I%ds" %(len(data)),len(data),data) 11 pkg2 = struct.pack(">I%ds" %(len("Nancy")),len("Nancy"),"Nancy") 12 pkg3 = struct.pack(">I%ds" %(len("Michael")),len("Michael"),"Michael") 13 s.send(pkg1 + pkg2 + pkg3) 14 print(pkg1,pkg2,pkg3) 15 print(pkg1 + pkg2 + pkg3) 16s.close()