20230908_python练习_服务端与客户端数据交互

news2024/10/7 11:31:27
	用户可以通过简单操作进行服务端数据交互,通过简单的sql语句直接获取EXCEL表,可以用来作为交互的基础。

主要涉及三部分:

1:数据库存储表结构
在这里插入图片描述

--日志记录表结构
create table shzc.yytowz_service_title
(leixing  varchar2(18),ziduan1  varchar2(3000),ziduan2  varchar2(300),ziduan3  varchar2(300),ip_id  varchar2(18),
post_id  varchar2(18),in_time varchar2(30),mac varchar2(20),hostname varchar2(100),ip varchar2(30) );

2:服务端维持代码
在这里插入图片描述

# 服务端
import socketserver
import json
import os
#import pymysql
import cx_Oracle #Oracle 数据库连接
import time
import tqdm
import pandas as pd

class MyServer(socketserver.BaseRequestHandler):

    def handle(self):
        self.add_ip = self.client_address[0]
        self.add_post = str(self.client_address[1])

        while True:
            try:
                data = self.request.recv(102400)
                #如果获取为空就退出
                if not data:break
                #否则解码处理数据
                self.data = json.loads(data.decode('utf-8'))
                # data 是获取字典内容,self.client_address 是 ip地址与 端口
                print('客户端的消息:',self.data,self.client_address)
                #数据库对访问记录存档
                self.log_record()
                # 定义处理规则
                self.visit_response()
                #将结果反馈给客户端
                self.request.sendall(self.fankui.encode('utf-8'))
            except :
                #print('连接异常')
                break


    #定义处理规则
    def visit_response(self):
        #获取时间
        in_time = self.get_current_time()[0:14]

        if self.data['leixing'] == '文件传递':
            try:
                file_download_statr = self.file_download()
                self.fankui = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%s","ziduan3":"%s" }' % (
                self.data['leixing'], self.add_ip, self.add_post, file_download_statr)
            except:
                self.fankui = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%s","ziduan3":"%s" }' % (
                self.data['leixing'], self.add_ip, self.add_post, '传递失败')

        elif self.data['leixing'] == '文件下载': 
            # 获取sql语句生成表格
            download_start, file_path, file_name, file_size = Oracle_download(self.data['mac'], in_time,str(self.data['ziduan1']).replace("^","'"))
            print('download_start', download_start, '大小字节', file_size, '文件名', file_name)
            try:
                # 将表格返回客户端
                file_download_statr = self.file_up(file_path,self.data['ziduan3'])
                self.fankui = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%s","ziduan3":"%s" }' % (
                self.data['leixing'], file_path, file_size, file_download_statr)
            except:
                self.fankui = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%s","ziduan3":"%s" }' % (
                self.data['leixing'], file_path, file_size, '传递失败')

        elif self.data['leixing'] == '发起访问':
            try:
                self.fankui = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%s","ziduan3":"%s" }' % (
                self.data['leixing'], self.add_ip, self.add_post, '访问成功')
            except:
                self.fankui = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%s","ziduan3":"%s" }' % (
                self.data['leixing'], self.add_ip, self.add_post, '访问失败')

        else:
            try:
                self.fankui = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%s","ziduan3":"%s" }' % (
                self.data['leixing'], self.add_ip, self.add_post, '访问成功')
            except:
                self.fankui = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%s","ziduan3":"%s" }' % (
                self.data['leixing'], self.add_ip, self.add_post, '访问失败')

    #文件下载函数
    def file_download(self):
        in_time = self.get_current_time()[0:14]
        file_path = self.data['ziduan1']
        file_size = self.data['ziduan2']
        file_hz = file_path.split('/')[-1]
        print('接收文件名:',file_hz,' 接收文件大小:',file_size,' 字节')
        # 文件传输的缓冲区
        BUFFER_SIZE = 4096
        # 接受客户端信息
        filename, file_size, new_filename = self.data['ziduan1'], self.data['ziduan2'], str(self.data['ziduan3'])[0:6]
        #判断月文件夹是否存在,不存在创建一个
        file_path_state1 = os.path.exists('./file_server/'+new_filename)
        if file_path_state1 == False:
            os.mkdir('./file_server/'+new_filename)
        # 获取文件的名字
        filename = os.path.basename(filename)
        file_size = int(file_size)
        if os.path.isfile(filename):
            f = open('./file_server/'+new_filename +'/' + self.data['mac'] + '_' + in_time + '_' + file_hz, "wb")
        else:
            f = open('./file_server/'+new_filename +'/' + self.data['mac'] + '_' + in_time + '_' + file_hz, "wb")
        rece_size = 0
        while rece_size < file_size:
            data = self.request.recv(BUFFER_SIZE)
            f.write(data)
            rece_size += len(data)
        else:
            return '传递成功'

    def file_up(self,fujian_label,in_time):
        # 文件传输的缓冲区
        BUFFER_SIZE = 4096
        # 传递文件到指定目录下
        filename = fujian_label.replace('/', '//')
        # 文件大小
        file_size = os.path.getsize(filename)
        # 创建连接
        chuandi_tup = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%d","ziduan3":"%s" }' % (
            '文件提取', filename, file_size, in_time)
        self.request.sendall(chuandi_tup.encode('utf-8'))
        # 文件传输
        progress = tqdm.tqdm(range(file_size), f"发送{filename}", unit="B", unit_divisor=1024)

        with open(filename, "rb") as f:
            for _ in progress:
                # 读取文件
                bytes_read = f.read(BUFFER_SIZE)
                if not bytes_read:
                    break
                # sendall确保及时网络忙碌的时候,数据仍然可以传输
                self.request.sendall(bytes_read)
                progress.update(len(bytes_read))
        # 关闭资源
        self.request.close()

    #数据库登录
    def mysql_execute(self, in_sql, leixing):
        # 登录数据库
        dsn = "134.80.200.216/xxx"
        try:
            conn = cx_Oracle.connect(user="zbweb", password="zibo_xxx", dsn=dsn, encoding="UTF-8")
        except:
            time.sleep(10)
            conn = cx_Oracle.connect(user="zbweb", password="zibo_xxx", dsn=dsn, encoding="UTF-8")

        # 得到一个可以执行SQL语句的光标对象
        cursor = conn.cursor()
        # 数据库执行导入的语句
        if leixing == '数量':
            # 反馈数量
            count = cursor.execute(in_sql)
        elif leixing == '单条':
            # 反馈单条
            cursor.execute(in_sql)
            count = cursor.fetchone()[0]
        elif leixing == '多条':
            # 反馈多条
            cursor.execute(in_sql)
            count = cursor.fetchall()
        elif leixing == '编辑':
            count = cursor.execute(in_sql)
            conn.commit()
        # 关闭光标对象
        cursor.close()
        # 关闭数据库连接
        conn.close()
        # 反馈
        return count

    # 时间计算
    def get_current_time(self):
        ct = time.time()
        local_time = time.localtime(ct)
        data_head = time.strftime("%Y%m%d%H%M%S", local_time)
        data_secs = abs(ct - round(ct)) * 1000
        time_stamp = "%s%03d" % (data_head, data_secs)
        return time_stamp

    #日志留存
    def log_record(self):
        in_time = self.get_current_time()[0:14]
        ziduan1 = str(self.data['ziduan1']).replace("'","^")
        sql = "insert into shzc.yytowz_service_title (leixing,ziduan1,ziduan2,ziduan3,ip_id,post_id,in_time,mac,hostname,ip) values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s') " % (
            self.data['leixing'], ziduan1, self.data['ziduan2'], self.data['ziduan3'], str(self.client_address[0]),str(self.client_address[1]),in_time, self.data['mac'], self.data['hostname'], self.data['ip'])
        num = self.mysql_execute(sql,'编辑')
        #print('num',num)
        return num

# 时间计算
def get_current_time(input_date='0'):
    # 如果时间传入为空
    if input_date == '0':
        ct = time.time() # - 24 * 60 * 60  #如果是取昨天日期是减数值
        local_time = time.localtime(ct)
        data_head = time.strftime("%Y%m%d%H%M%S", local_time)
        data_secs = abs(ct - round(ct)) * 1000
        time_stamp = "%s%03d" % (data_head, data_secs)
    else:
        time_stamp = input_date + '120000001'
    return time_stamp

def file_transfer(user,file_name):
    #获取月份
    in_month = get_current_time()[0:6]
    # 文件传递给服务器
    file_path = file_name
    file_statr = user.file_up(file_path, in_month)
    # 如果执行结果不成功,再次执行一次,保底
    if file_statr['ziduan3'] != '传递成功':
        file_statr = file_transfer(user,file_name)
        return file_statr
    else:
        return file_statr

#这里用作程序预备,目前建立必要的文件夹
def server_init():
    # 程序执行前先确认 ./file_server/ 是否存在,不存在新建
    file_path_state1 = os.path.exists('./file_server')
    if file_path_state1 == False:os.mkdir('./file_server')
    file_path_state1 = os.path.exists('./file_server/file_out')
    if file_path_state1 == False: os.mkdir('./file_server/file_out')

#文件数据生成,分mac与时间,不然没法同步下载
def Oracle_download(mac,in_time,sql='0'):
    # 结果数据生成表格准备发送
    dsn = "134.80.200.216/pdbzbjs1"
    conn = cx_Oracle.connect(user="zbweb", password="zibo_533_03", dsn=dsn, encoding="UTF-8")
    df = pd.read_sql("""%s""" % sql, con=conn)
    df.to_excel("./file_server/file_out/"+mac+"_"+in_time+"_结果下载.xlsx", index=False)
    # 文件大小
    file_path = './file_server/file_out/'+mac+'_'+in_time+'_结果下载.xlsx'
    file_name = file_path.split('/')[-1]
    file_size = os.path.getsize(file_path)
    #返回根据语句处理结果与
    return "结果下载",file_path,file_name,file_size

if __name__ == '__main__':
    #服务器文件夹准备
    server_init()
    #服务器开始
    s = socketserver.ThreadingTCPServer(('134.35.10.10', 8967), MyServer)
    #类似实现连接循环
    s.serve_forever()

3:客户端代码
在这里插入图片描述

# 客户端
import socket
import json
import time
import os
import tqdm
import uuid #获取系统mac



class My_Main():

    def __init__(self):
        # 程序执行前先确认 ./file_server/file_work_order/ 是否存在,不存在新建
        file_path_state1 = os.path.exists('./file_main')
        if file_path_state1 == False: os.mkdir('./file_main')
        # 定义服务端地址
        self.ip_num, self.port_num = '134.35.10.10', 8967
        # mac
        self.mac = uuid.UUID(int=uuid.getnode()).hex[-12:]
        # 获取主机名
        self.hostname = socket.gethostname()
        # 获取IP
        self.ip = socket.gethostbyname(self.hostname)

    #发起访问调用模块
    def socket_dlgc(self,leixing, name_text, pass_text):
        # 获取14位长度时间,年月日时分秒的
        self.in_time = get_current_time()[0:14]
        tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcp_client.connect((self.ip_num, self.port_num))
        if None == name_text:print('与服务器断开连接')
        #发送
        msg = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%s","ziduan3":"%s","mac":"%s","hostname":"%s","ip":"%s" }' % (
            str(leixing), str(name_text), str(pass_text), self.in_time,self.mac, self.hostname, self.ip)
        tcp_client.send(msg.encode("utf-8"))  # 说话    #
        data = tcp_client.recv(102400)  # 听话
        js_data = json.loads(data.decode('utf-8'))
        tcp_client.close()
        return js_data

    # 文件下载函数
    def file_download(self,sql):
        # 获取14位长度时间,年月日时分秒的
        self.in_time = get_current_time()[0:14]
        # 套接字是对访问的ip地址和端口反馈,需要从开始定好
        tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcp_client.connect((self.ip_num, self.port_num))
        # 申请数据下载
        chuandi_tup = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%d","ziduan3":"%s","mac":"%s","hostname":"%s","ip":"%s" }' % (
            '文件下载', sql, 1, self.in_time+'.xlsx',self.mac, self.hostname, self.ip)
        tcp_client.send(chuandi_tup.encode("utf-8"))  # 说话
        self.data = tcp_client.recv(102400)  # 听话
        js_data = json.loads(self.data.decode('utf-8'))
        #print(js_data, type(js_data))
        if js_data['ziduan1'] not in ('', None):
            file_size = int(js_data['ziduan2'])
            #print(file_size)
            filename = js_data['ziduan3']
            rece_size = 0
            recv_data = tcp_client.recv(4096)
            if recv_data:  # 如果获取数据不为空
                try:
                    with open('./file_main/' + filename, "wb")as f:
                        f.write(recv_data)
                        while rece_size < file_size:
                            recv_data = tcp_client.recv(4096)
                            f.write(recv_data)
                            rece_size += len(self.data)

                    js_data = {'leixing': '文件下载', 'ziduan1': js_data['ziduan3'], 'ziduan2': file_size, 'ziduan3': '传递成功'}
                except:
                    js_data = {'leixing': '文件下载', 'ziduan1': js_data['ziduan3'], 'ziduan2': file_size, 'ziduan3': '传递失败'}
            # 关闭套接字
            tcp_client.close()
        return js_data

    #客户端文件上传,fujian_label 文件全路径
    def file_up(self,fujian_label):
        # 获取14位长度时间,年月日时分秒的
        self.in_time = get_current_time()[0:14]
        # 文件传输的缓冲区
        BUFFER_SIZE = 4096
        # 创建连接
        s = socket.socket()
        s.connect((self.ip_num, self.port_num))
        # 传递文件到指定目录下
        filename = fujian_label.replace('/', '//')
        # 文件大小
        file_size = os.path.getsize(filename)

        chuandi_tup = '{"leixing":"%s","ziduan1":"%s","ziduan2":"%d","ziduan3":"%s","mac":"%s","hostname":"%s","ip":"%s" }' % (
            '文件传递', filename, file_size, self.in_time,self.mac, self.hostname, self.ip )
        s.send(chuandi_tup.encode())
        # 文件传输
        progress = tqdm.tqdm(range(file_size), f"发送{filename}", unit="B", unit_divisor=BUFFER_SIZE)
        with open(filename, "rb") as f:
            for _ in progress:
                # 读取文件
                bytes_read = f.read(BUFFER_SIZE)
                if not bytes_read:
                    break
                try:
                    # sendall确保及时网络忙碌的时候,数据仍然可以传输
                    s.sendall(bytes_read)
                    progress.update(len(bytes_read))
                except:
                    js_data = {'leixing': '文件传递', 'ziduan1': self.ip_num, 'ziduan2': self.port_num, 'ziduan3': '传递失败'}
                    break
        #文件传递完后,看看是否有反馈,有的话函数返回
        try:
            data = s.recv(102400)  # 听话
            js_data = json.loads(data.decode('utf-8'))
        except:
            js_data = {'leixing': '文件传递', 'ziduan1': self.ip_num, 'ziduan2': self.port_num, 'ziduan3': '传递失败'}
        # 关闭资源
        s.close()
        return js_data

# 时间计算
def get_current_time(input_date='0'):
    # 如果时间传入为空
    if input_date == '0':
        ct = time.time() # - 24 * 60 * 60  #如果是取昨天日期是减数值
        local_time = time.localtime(ct)
        data_head = time.strftime("%Y%m%d%H%M%S", local_time)
        data_secs = abs(ct - round(ct)) * 1000
        time_stamp = "%s%03d" % (data_head, data_secs)
    else:
        time_stamp = input_date + '120000001'
    return time_stamp

#文件传递给服务器
def file_transfer(user,file_name,num=0):
    # 防止有语法错误等原因导致死循环,限制最多处理4次
    if num < 5:
        # 文件传递给服务器
        try:
            file_statr = user.file_up(file_name)
            num += 1
        except:
            file_statr = {'leixing': '文件传递', 'ziduan1': file_name, 'ziduan2': '0', 'ziduan3': '传递失败'}
            num += 1
        # 如果执行结果不成功,再次执行一次,保底
        if file_statr['ziduan3'] != '传递成功':
            file_statr = file_transfer(user,file_name,num)
            return file_statr
        else:
            return file_statr
    else:
        file_statr = {'leixing': '文件传递', 'ziduan1': file_name, 'ziduan2': '0', 'ziduan3': '传递失败'}
        return file_statr

#文件传递给服务器
def file_gain(user,sql,num=0):
    #防止有语法错误等原因导致死循环,限制最多处理4次
    if num < 5:
        # 文件传递给服务器
        try:
            file_statr = user.file_download(sql)
            num += 1
        except:
            file_statr = {'leixing': '文件下载', 'ziduan1': sql, 'ziduan2': '0', 'ziduan3': '传递失败'}
            num += 1
        # 如果执行结果不成功,再次执行一次,保底
        if file_statr['ziduan3'] != '传递成功':
            file_statr = file_gain(user,sql,num)
            return file_statr
        else:
            return file_statr
    else:
        file_statr = {'leixing': '文件下载', 'ziduan1': sql, 'ziduan2': '0', 'ziduan3': '传递失败'}
        return file_statr

def use_show():
    print('请您选择需要处理的类型(请输入选择的编码):')
    print('类型:发起访问 编码:1')
    print('类型:文件传递 编码:2')
    print('类型:文件下载 编码:3')

def use_choice(use_input):
    if use_input == '1':use_type = '发起访问'
    elif use_input == '2':use_type = '文件传递'
    elif use_input == '3':use_type = '文件下载'
    else:use_type = '类型不详'
    return use_type

def use_decision(user,use_input):
    if use_input == '1':
        name_text = input('请您输入需要发起的标题:')
        pass_text = input('请您输入需要发起的内容:')
        socket_dlgc_statr = user.socket_dlgc('发起访问', name_text, pass_text)
        print('系统反馈:', socket_dlgc_statr)

    elif use_input == '2':
        wav_write = input('请您输入需要发送文件名:')
        transfer_statr = file_transfer(user, wav_write)
        print('系统反馈:',transfer_statr)

    elif use_input == '3':
        sql = input('请您输入需要发送的语句:').replace("'","^")
        gain_statr = file_gain(user, sql)
        print('系统反馈:', gain_statr)
    else:
        use_type = '类型不详'
    pass

if __name__ == '__main__':

    # 加载类
    user = My_Main()

    # 循环执行
    while True:
        use_show()
        use_input = input('请您输入选择的编码:')
        use_type = use_choice(use_input)

        print('您选择需要处理的类型:',use_type)

        #类型不详就断开
        if use_type=='类型不详':break

        use_decision(user, use_input)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/989124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#__多线程之任务和连续任务

/// <summary> /// /// 任务&#xff1a;System.Threading.Tasks&#xff08;异步编程的一种实现方式&#xff09; /// 表应完成某个单元工作。这个工作可以在单独的线程中运行&#xff0c;也可以以同步方式启动一个任务。 /// /// 连续任务&#…

【笔试强训选择题】Day36.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言一、Day…

蚂蚁发布金融大模型:两大应用产品支小宝2.0、支小助将在完成备案后上线

9月8日&#xff0c;在上海举办的外滩大会上&#xff0c;蚂蚁集团正式发布金融大模型。据了解&#xff0c;蚂蚁金融大模型基于蚂蚁自研基础大模型&#xff0c;针对金融产业深度定制&#xff0c;底层算力集群达到万卡规模。该大模型聚焦真实的金融场景需求&#xff0c;在“认知、…

六大排序算法(Java版):从插入排序到快速排序(含图解)

目录 插入排序 (Insertion Sort) 直接插入排序的特性总结&#xff1a; 选择排序 (Selection Sort) 直接选择排序的特性总结 冒泡排序 (Bubble Sort) 冒泡排序的特性总结 堆排序&#xff08;Heap Sort&#xff09; 堆排序的特性总结 希尔排序 (Shell Sort) 希尔排序的…

【Redis】3、Redis主从复制、哨兵、集群

Redis主从复制 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务器…

SpringMvc 之crud增删改查应用

目录 1.创建项目 2.配置文件 2.1pom.xml文件 2.2 web.xml文件 2.3 spring-context.xml 2.4 spring-mvc.xml 2.5 spring-MyBatis.xml 2.6 jdbc.properties 数据库 2.7 generatorConfig.xml 2.8 日志文件log4j2 3.后台代码 3.1 pageBean.java 3.2切面类 3.3 biz层…

米尔电子|第十六届STM32全国研讨会即将走进11个城市

2023年9月12日至10月27日&#xff0c;以“STM32&#xff0c;不止于芯”为主题的第十六届STM32全国巡回研讨会将走进11个城市。本届研讨会为全天会议&#xff0c;我们将围绕STM32最新产品开展技术演讲和方案演示。 本次STM32全国研讨会&#xff0c;米尔电子将现场展出STM32相关…

Unity——导航系统补充说明

一、导航系统补充说明 1、导航与动画 我们可以通过设置动画状态机的变量&#xff0c;让动画匹配由玩家直接控制的角色的移动。那么自动导航的角色如何与动画系统结合呢&#xff1f; 有两个常用的属性可以获得导航代理当前的状态&#xff1a; 一是agent.velocity&#xff0c;…

GO语言网络编程(并发编程)并发介绍,Goroutine

GO语言网络编程&#xff08;并发编程&#xff09;并发介绍&#xff0c;Goroutine 1、并发介绍 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。 B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更…

Java“牵手”天猫商品详情数据,天猫商品详情API接口,天猫API接口申请指南

天猫平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xff0c;通过…

重排链表(算法时间复杂度O(NlogN))

给定一个单链表 L1​→L2​→⋯→Ln−1​→Ln​&#xff0c;请编写程序将链表重新排列为 Ln​→L1​→Ln−1​→L2​→⋯。例如&#xff1a;给定L为1→2→3→4→5→6&#xff0c;则输出应该为6→1→5→2→4→3。 输入格式&#xff1a; 每个输入包含1个测试用例。每个测试用例…

2023-9-8 扩展欧几里得算法

题目链接&#xff1a;扩展欧几里得算法 #include <iostream> #include <algorithm>using namespace std;int exgcd(int a, int b, int &x, int &y) {if(!b){x 1, y 0;return a;}int d exgcd(b, a % b, y, x);y - a / b * x;return d; }int main() {int…

数据结构之栈的实现(附源码)

目录 一、栈的概念及结构 ​二、栈的实现 三、初学栈的练习题 一、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出…

Android SDK 上手指南||第十一章 虚拟与物理设备

第十一章 虚拟与物理设备 在之前的文章里&#xff0c;大家已经了解了Android项目当中的基本元素、接触了用户界面的设计以及数据存储方案。接下来&#xff0c;我们将一同探索如何在物理及虚拟设备上运行自己的应用程序并与之互动。在系列文章的下一篇中&#xff0c;我们将分步…

【漏洞复现】一米OA存在任意文件读取漏洞

漏洞描述 一米OA协同办公系统,集成了OA办公自动化系统、手机客户端、专业报表工具,为全国千万企业用户提供全功能、性价比高的OA软件。 该OA系统的getfile.jsp文件存在任意文件上传漏洞,攻击者通过漏洞可以获取服务器的敏感信息。 免责声明 技术文章仅供参考,任何个人和…

浅谈高并发分布式架构演进路径

前言 一直很想写一篇能覆盖分布式方面的文章&#xff0c;但当写的时候发现分布式技术发展到现在阶段&#xff0c;有太多的最佳实践和方法论&#xff0c;网上的文章也特别多&#xff0c;根本无从下手。思来想去&#xff0c;发现很多最佳实践都是有一定的理论支撑&#xff0c;我…

图书管理系统 毕业设计

图书管理系统 毕业设计 摘 要 摘要&#xff1a;二十一世纪是信息的世纪&#xff0c;随着社会经济的发展&#xff0c;社会信息化程度也越来越高&#xff0c;学校作为教育与科技的先行者&#xff0c;优秀的技术往往会被所率先学校采用。优秀的学校管理决策者一定会毫不犹豫地选…

vue中获取农历时间

1.下载依赖 npm i chinese-lunar-calendar 2.局部使用 import { getLunar } from chinese-lunar-calendar; 3.使用 getLunar(new Date().getFullYear(), new Date().getMonth() 1, new Date().getDate()) 结果

【Java】高效利用异常处理技巧

文章目录 前言Java异常体系Error和ExceptionThrowable 常见的错误和异常编译时异常运行时异常Error 异常的处理捕获异常声明抛出异常类型 手动抛出异常对象&#xff1a;throw语法格式注意事项 自定义异常为什么需要自定义异常类 小结 前言 在使用计算机语言进行项目开发的过程…