文档章节

迷你软件制作

陈家栋
 陈家栋
发布于 2016/03/31 22:25
字数 1478
阅读 42
收藏 1

一、需求

做个可执行文件,让用户在自己的机器上双击执行后,可以把以下信息发送到服务器:

1、  主机名

2、  CPU型号信息

3、  内存

4、  IP地址

5、  操作系统版本

6、  磁盘大小

7、  应用列表

服务器接收到这些数据之后,会将它们存储在数据库中,以便管理员进行查询。

二、环境介绍

服务器:使用Ubuntu14.04作为信息接收与信息处理的服务器。

客户端:支持win7win10win2008win2012

数据库:在服务器上使用python自带的sqlite3来保存数据,无用户名和密码,可以直接对数据库进行查询。

三、步骤

1、制作客户端程序

1)安装psutil模块

该模块用于提取终端信息。具体安装如下:

#先安装pip
C:\Users\SoSoul>python -m pip install --upgrade pip
#用pip安装psutil
C:\Users\SoSoul>python -m pip install psutil

        2dataTransfer.py

主要用途:主要用于将用户终端的信息发送给服务器。用pickle将信息存储,并且通过socketpickle文件中的二进制内容发送到服务器上。

实现代码:

import pickle
import extractInfoWin
from socket import *
 
#extract host information and write them to file using pickle
endpointInfo = extractInfoWin.finalAllInfo()
endpointFile = open('ep.pkl', 'wb')
pickle.dump(endpointInfo, endpointFile)
endpointFile.close()
 
#send information to the server
serverIP = '10.33.140.76'
serverPort = 8888
sockobj = socket(AF_INET, SOCK_STREAM)
sockobj.connect((serverIP, serverPort))
 
endpointFile = open('ep.pkl', 'rb')
msg = endpointFile.read(1024)
while msg:
         sockobj.send(msg)
         msg = endpointFile.read(1024)
endpointFile.close()
sockobj.close()

        3extractInfoWin.py

主要用途:主要用于提取用户终端的信息。

实现代码:

import sys 
import os  
import atexit 
import time  
import psutil  
import socket
import cpuinfo
import platform
from winreg import *
 
def getHostname():
    return socket.gethostname()
 
def getCPUModel():
    s = cpuinfo.finalResult().split(':')[1]
    return s
   
 
def getMemorystate():  
    phymem = psutil.virtual_memory() 
    line = ("Memory: %s"%(str(int(phymem.total/1024/1024))+"M"  )).split(':')[1]
    return line
 
def getlocalIPs():
    hostname = socket.gethostname()
    IPinfo = socket.gethostbyname_ex(hostname)
    allIP = IPinfo[2]
    return allIP
 
def getOSVersion():
    return platform.platform()
 
def getDiskInfo():
    total = 0
    for x in ('a','b','c:','d:','e:','f:','g','h','i','j'):
        try:
            s = str(psutil.disk_usage(x))
            s = s.split(',')[0]
            s = s.split('=')[1]
            size = int(s)/1024/1024/1024
            total = total+size
        except:
            continue
    return str('%.2f' % total)+'G'
 
def getSoftware():
    #print('Installed Softwares:')
    aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE)
    aKey = OpenKey(aReg, r"SOFTWARE")
    softwarelist = []
    for i in range(1024):
        try:
            softwarelist.append(EnumKey(aKey,i))
        except:
            break
    CloseKey(aKey)
    CloseKey(aReg)
    #print(softwarelist)
    return softwarelist
 
def finalAllInfo():
    hostInfoMap = {}
    keylist = ['Hostname','CPU','Memory','IP','OSversion','Disk','AppList']
    valuelist = []
    valuelist.append(getHostname())
    valuelist.append(getCPUModel())
    valuelist.append(getMemorystate())
    valuelist.append(getlocalIPs())
    valuelist.append(getOSVersion())
    valuelist.append(getDiskInfo())
    valuelist.append(getSoftware())
    hostInfoMap = dict(zip(keylist, valuelist))
    return hostInfoMap

        4cpuinfo.py

主要用途:主要用于提取用户终端的CPU型号信息。

实现代码(本代码摘自网上,最后添加了一个返回信息的函数):

       注意: 由于本模块过大,所以等会提供下载链接!

2、制作服务器端程序

1dataProcessServer.py

主要用途:主要用于接收用户终端发送过来的信息,并且将这些信息存储到数据库中。

实现代码:

from socket import *
import pickle
import sqlite3
 
serverIP = '10.33.140.76'
serverPort = 8888
sockobj = socket(AF_INET, SOCK_STREAM)
sockobj.bind((serverIP, serverPort))
sockobj.listen(10)
 
conn = sqlite3.connect('endpointDatabase')
curs = conn.cursor()
tblcmd = 'create table endpointInformation(hostname char(50), hostIP char(80), CPU char(80), OSVersion char(30), Memory char(15), DiskInfo char(20),AppList char(200))'
curs.execute(tblcmd)
 
while True:
    i = 1
    connection, address = sockobj.accept()
    print('Server Connected by', address)
    clientFile = open('client'+str(i)+'.pkl','wb')
    data = connection.recv(1024)
    while data:
        clientFile.write(data)
        data = connection.recv(1024)
    clientFile.close()
    clientFile = open('client'+str(i)+'.pkl','rb')
    information = pickle.load(clientFile)
    clientFile.close()
    curs.execute('insert into endpointInformation values (?, ?, ?, ?, ?, ?, ?)', (str(information['Hostname']), str(information['CPU']), str(information['Memory']), str(information['IP']), str(information['OSversion']), str(information['Disk']), str(information['AppList'])))
    conn.commit()
    print(information)
    connection.close()
    i += 1

2)testdatabase.py

主要用途:用于测试服务器生成的数据库信息。用select语句获取数据库中的所有信息。

实现代码:

import sqlite3
 
conn = sqlite3.connect('endpointDatabase')
curs = conn.cursor()
curs.execute('select * from endpointInformation')
print(curs.fetchall())

3、将客户端程序制作成可执行程序

        1py2exe

据说这是一个非常经典的将py文件转换为exe文件的工具,但是对python 的版本限制比较严,而且有bug,不用。

        2cx_Freeze

据说这是一个比py2exe好用的转换工具,但是对版本限制也比较严,也有bug,不用。

3)pyinstaller

这就是本次所用的转换工具,应该是支持任何python版本,并且转换工作和前两者相比相当简单。

#下载安装pyinstaller:
D:\000 myDoc\08 提取用户信息\forWindows>python -m pip install --upgrade pyinstaller
#对py文件进行转换:
D:\000 myDoc\08 提取用户信息\forWindows>pyinstaller dataTransfer.py

下面的链接提供了我自己录制的视频、完整的代码、使用文档、可执行文件,有兴趣的哥们可以自己down下来研究研究:

https://yunpan.cn/cqccZYAjsjurb  访问密码 3e63

土豆网上也有我的视频哦,后续提供链接。

四、使用教程

1、服务器

要先在服务器上开启服务。

如下图所示,在服务器上只需要切换到程序所在目录,执行即可:

2、客户端(以win2008为例)

将压缩文件解压:

双击可执行文件:

客户端操作完毕。

3、现象

服务器控制台会有回显信息。

使用python脚本查询服务器数据库:


4、数据库

本次使用的sqlite3Python内置的数据库,可以用python语句直接访问,没有用户名和密码。

使用如下键值列表:

keylist = ['Hostname','CPU','Memory','IP','OSversion','Disk','AppList']

它们都是char类型,改数据库具体创建如下:

create table endpointInformation(hostname char(50), hostIP char(80), CPU char(80), OSVersion char(30), Memory char(15), DiskInfo char(20),AppList char(200))

-

下面的链接提供了我自己录制的视频、完整的代码、使用文档、可执行文件,有兴趣的哥们可以自己down下来研究研究:

https://yunpan.cn/cqccZYAjsjurb  访问密码 3e63

土豆网上也有我的视频哦,下面是链接:

http://www.tudou.com/programs/view/8d-JzM8DaxQ/

© 著作权归作者所有

共有 人打赏支持
陈家栋
粉丝 2
博文 12
码字总数 5545
作品 0
海淀
私信 提问
Microsoft Excel 2010--迷你图

迷你图是EXCEL2010中加入的一种全新的图表制作工具,它以单元格为绘图区域,简单便捷的为我们绘制出简明的数据小图表,方便的把数据以小图的形式呈现在读者的面前,它是存在于单元格中的小图...

xiaopei050
06/27
0
0
电脑上被永久删除的文件如何恢复

   大家在使用电脑的时候是不是出现过这些问题,桌面文件使用快捷键删除、硬盘被格式化、电脑里面的文件被杀毒软件删除等情况,遇到对于自己很重要的文件在这样的情况我们都会焦急如焚。其...

qq5b693baba9285
08/17
0
0
pcDuino–voip服务器设置呼叫彩铃

首先需要几个工具,第一个txtvoice 第二个,音频转换软件 首先需要制作一段定制的彩铃。 在txtvoice里面输入: pcDuino是一款由美国技术团队研发新型学习开发板,被誉为“增强版树莓派(Ras...

pc朵拉
2013/07/03
0
0
Office 2010 新特性 (二) Excle 2010

跟前一版本一样,作为 Microsoft Office 2010 产品中的一个重要组件,Excel 2010 较 Excel 2007 来说也有很多改进,但总体来说改变不大。下面来做详细介绍: 全新的界面 在整体界面方面,Exc...

技术小胖子
2017/11/09
0
0
“龙芯杯”中国科学院全国开源软件大赛进行中

开源中国社区讯:“龙芯杯”中国科学院全国开源软件大赛正在进行中,并向各开源组织或个人发起参赛邀请函。主要参赛者对象:高校学生、开源社区、独立个人或团队、开源企业。 参赛作品条件:...

老枪
2010/08/17
860
8

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(三)之NioEventLoop的线程(或者reactor线程)启动(一)

在第一章中,我们看关于NioEventLoopGroup的初始化,我们知道了NioEventLoopGroup对象中有一组EventLoop数组,并且数组中的每个EventLoop对象都对应一个线程FastThreadLocalThread,那么这个...

天空小小
今天
3
0
PHP动态扩展Redis模块

查看已有模块 [root@test-a ~]# /usr/local/php/bin/php -m[PHP Modules]bz2Core...zlib[Zend Modules] 下载包,解压,生成configure文件 [root@test-a ~]# cd /usr/local/src/[ro......

野雪球
今天
4
0
在Ignite中使用线性回归算法

在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。 如果要找合适的数据集,会发现可用的有很多,但是对于...

李玉珏
今天
5
0
Mybatis应用学习——简单使用示例

1. 传统JDBC程序中存在的问题 1. 一个简单的JDBC程序示例: public class JDBCDemo {public static void main(String[] args) {Connection con=null;PreparedStatement statemen...

江左煤郎
今天
4
0
使用JavaScript编写iOS应用业务逻辑

JSAUIKitCocoa使你可以使用JavaScript编写对性能要求不高但可能变动性很大的iOS应用的业务逻辑部分,View组件、需要多线程支持的Model等则直接使用原生对象。 编写方式与React Native相似,但...

neal01
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部