触动精灵远程Log模块

一、功能

  lua log方法能够自动发现同一网段下面的log服务器

  lua log方法能够主动将log发给服务器

  lua 客户端进程重启服务端不存在影响

二、实现

  服务器使用python编写:

    启动一个线程,用UDP监听特定端口,接受客户端的扫描,反馈日志的端口

    启动一个线程,监听特定端口,接受TCP连接,分派新的日志线程处理log

  客户端使用lua 编写:

    打印log之前使用UDP套节字扫描服务器的日志端口,然后创建TCP套节字发送日志

三、源代码:

  服务器:

  

import socket
import time
import re
import thread

udp_listen_port = 31500
tcp_listen_port = 31501
stop_udp_server = False

def getLocalIP():
    myname = socket.getfqdn(socket.gethostname())
    myaddr = socket.gethostbyname(myname)
    return myaddr;

def getTime():
    return time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime(time.time()))

def Log(content):
    print("[%s]: %s" % (getTime() ,content))

def startUDPServer():

    address = (getLocalIP(), udp_listen_port)
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(address)

    print(‘listen broadcast %s:%s‘ % address)
    Log(‘listen broadcast %s:%s‘ % address)
    while not stop_udp_server:
        data, addr = s.recvfrom(2048)
        if not data:
            Log("client not existed!")
            continue
        Log(‘received %s from %s‘ % (data, addr))

        client_ip_port = ‘{0}:{1}‘.format(addr[0],addr[1])

        pat = re.compile("^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d+)$")
        for ip,port in pat.findall(client_ip_port):
            Log(‘Got iphone addr:port = %s %s‘ % (ip, port))
            local_addr_port = (getLocalIP(), tcp_listen_port)
            Log(‘Rsp server addr:port = %s %s‘ % local_addr_port)
            rsp_data = ‘{0}‘.format(local_addr_port[1])
            s.sendto(rsp_data,addr)
            break;

    s.close()

def startTCPLogServer(sock,client):
    while(True):

        try:
            data = sock.recv(4096)
            if data:
                pat = re.compile(‘\[(.*?)\]‘)
                for log in pat.findall(data):
                    Log(log)
            else:
                break;
        except socket.error:
            sock.close()
            break
    Log(‘client (%s,%s) close‘ % client);
    sock.close()

def startTCPListenServer():
    #create tcp socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #bind local ip-port
    server_addr = (getLocalIP(), tcp_listen_port)
    Log(‘start tcp server on %s port %s‘ % server_addr)
    sock.bind(server_addr)
    sock.listen(5)

    #print recv data
    while(True):
        ss,addr = sock.accept()
        Log(‘Got log client from (%s,%s)‘ % addr)
        thread.start_new_thread(startTCPLogServer,(ss,addr,))
    sock.close()

if __name__ == ‘__main__‘:
    t_udp = thread.start_new_thread(startUDPServer, ())
    t_tcp = thread.start_new_thread(startTCPListenServer, ())

    while (True):
        time.sleep(1)

  客户端:

 

udp_listen_port = 31500

tcp_server_ip = ""
tcp_server_port = 0

function getLocalIP()
  local socket = require("socket")
  local ip, v = socket.dns.toip(socket.dns.gethostname())
  for k,v in pairs(v.ip) do
      return v
  end
  return nil
end

function tryFindLogServer()

  local ip = getLocalIP();
  local ipTable = {}
  local socket = require("socket")
  local udp = socket.udp()

  if ip ~= nil then
    for i in string.gmatch(ip, "%d+") do
      print(i)
      table.insert(ipTable,i)
    end
  end
  local length = table.getn(ipTable)
  local findip = nil
  local findport = nil
  if length > 0 then
    for i = 100, 255 do
      local desIP = string.format("%s.%s.%s.%s",ipTable[1], ipTable[2], ipTable[3], tostring(i))
      print(desIP)
      udp:setpeername(desIP, udp_listen_port)
      udp:settimeout(0.5)
      udp:send("Hello")
      data = udp:receive()
      if data ~= nil then
          print(string.format("find server %s:%s", desIP,data))
          tcp_server_ip = desIP
          tcp_server_port = tonumber(data)
          return true;
      end
    end
  end
  return false
end

tcp = nil

function Log( content )
    -- body
    if tcp == nil then
    local socket = require("socket")
        tcp = socket.tcp()
        tcp:connect(tcp_server_ip,tcp_server_port)
    end
    tcp:send(string.format("[%s]",tostring(content)))
end

if tryFindLogServer() then

  for i = 1,100 do
    Log("find server")
  end

end

四、客户端lua中加载luasocket的方式如下:

local sz = require("sz")
local http = require("szocket.http")
local res, code = http.request("http://www.baidu.com");
if code == 200 then
    Log("start")
    Log(res)
    dialog(res,0);
    Log("end")
end
时间: 2024-10-13 17:13:40

触动精灵远程Log模块的相关文章

[触动精灵]零基础小白学触动5-8

零基础小白学触动 - 05 - 触动常用函数 点击 滑动 原理 其实都可以分解成 按下=> 等待一定时间或者移动动作=>  松开 点击: tSLib库的函数tap(x,y) 后面还有2个参数 可以自己看手册  https://www.zybuluo.com/miniknife/note/293935#函数tap-点击 滑动  moveTo(x1,y1,x2,y2,step)   详细的   https://www.zybuluo.com/miniknife/note/293935#函数move

[触动精灵]触动精灵编辑器

1.编辑器的安装和使用 http://v.youku.com/v_show/id_XMTgwNzY3NzAwNA==.html https://www.zybuluo.com/miniknife/note/123055#触动精灵-ide-脚本编辑器使用手册 下载安装 小注意:可能的话 不要放到中文目录下 省事 Accesskey 小知识:注册账号成功--个人信息下查到 小知识:一个accesskey能连接多个设备 但是 有数量上限 一旦出现提示达到上限 ? ? 新建工程 连接设备广播开关 USB

[触动精灵] 零基础小白学触动13-16

小知识:触动精灵载入其他lua文件 require 以前我一直以为require只能加载模块文件 但是其实可以加载普通的其他lua文件  用法还是不加扩展名 触动精灵加载文件 都用require就可以 13 - 自动打开和关闭应用 小知识:触动下开启app和关闭app 查看对应app的包名 官方的runApp函数还可能存在无法启动app的情况 所以我就给封装了一下 万一出现无法启动 包名没有安装等情况 就日志记录 并且有弹窗提示 下面代码  没有traceprint try catch 等函数本

[触动精灵]触动精灵官方手册流水账1

官方手册 http://www.touchsprite.com/helpdoc#/doc?id=2148 小知识:手册的查询功能 注意 这里能精确的查询对应函数 但是无法模糊查询 比如记不起某个函数名 但是记得函数的说明的几个关键字  这样的模糊查询并不支持 触动精灵的lua版本是5.2.3 traceprint("lua版本:[" .. tostring(_VERSION) .. "]")--  [init.lua]第10行  lua版本:[Lua 5.2] 触动

【图文教程】小米4如何获取触动精灵悬浮窗权限

机型:小米4 系统:4.4.4 1. 打开设置,在界面底部找到其他应用管理,点击 2. 在打开的界面找到触动精灵并点击 3. 在应用详情界面上滑,点击底部的权限管理 4. 点击悬浮窗管理,在弹出的底部菜单选择允许

安装触动精灵

[1]确保您的设备已越狱,点击桌面图标进入Cydia软件源,如图选择下方 "软件源" 按钮 [2]点击右上角 "编辑" 按钮 [3]点击编辑后,左边按钮会变为 "添加",点 "添加",在弹出窗口输入官方源地址:apt.touchsprite.com [4]在Cydia首页 "软件源" 中,找到已添加好的官方源,猛戳 [5]在 "分类" 列表里,选择 "触动精灵" ,戳

Python log 模块介绍

刚用Python log模块写了一个例子,记录一下. import logging import logging.handlers import os from datetime import datetime basedir=r'D:\log' LOG_LEVEL = 0 resultPath = os.path.join(basedir,'result') if not os.path.exists(resultPath): os.mkdir(resultPath) LOG_PATH = o

log 模块使用 (直接用的方法)

前情提要: 生活中经常用到log 模块. 但是原生的log 模块复杂或者有许多不好用得地方, 在此记录一个经常用的log 的基本操作方法 一:首先导入模块 import logging.config #这个和底下的logging 不重复 import os import logging 二:定义日志输出格式 1:标准模式 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename

ThinkPHP远程调用模块的操作方法 URL 参数格式

* 远程调用模块的操作方法 URL 参数格式 [项目://][分组/]模块/操作 * @param string $url 调用地址 * @param string|array $vars 调用参数 支持字符串和数组 * @param string $layer 要调用的控制层名称 * @return mixed 演示案例:http://www.yixingmuban.com/ function R($url,$vars=array(),$layer='') { $info = pathinfo