Skynet 代码(1)

服务端:

#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()
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang