这是一个 Python 的程序,用于实现一个简单的 Web 服务器。程序首先导入了一些必要的模块,然后使用 PidFile 模块对代码块加锁,防止多个进程同时运行。接着定义了一个 response 函数,该函数用于响应客户端的请求,并根据请求的 URL 返回相应的内容。程序的 main 函数则用于初始化套接字、绑定端口、设置监听并等待接收请求。最后,如果该程序被直接运行,则调用 main 函数开始运行 Web 服务器。

# 会对with中的代码块加锁
with PidFile():
    import socket
    import re
    import threading
    import win32api
    import msg
    import time
    import os  # 执行文件
    import pyautogui
    import 通知内容
    import 在线数据
    from urllib import parse  # 转网址码
    import pymysql

    msg.se('1001', '[发送消息]WEB服务启动', '1')

    #######################隐藏执行后对话框##################

    import ctypes  # 隐藏执行后对话框

    whnd = ctypes.windll.kernel32.GetConsoleWindow()  # 隐藏执行后对话框
    if whnd != 0:  # 隐藏执行后对话框
        ctypes.windll.user32.ShowWindow(whnd, 0)  # 隐藏执行后对话框
        ctypes.windll.kernel32.CloseHandle(whnd)  # 隐藏执行后对话框

        #######################隐藏执行后对话框##################


    def response(new_socket):
        data = new_socket.recv(1024).decode('GBK').splitlines()

        # print('请求: ')
        for item in data:
            pass  # 空指令
            # print(item )

        ret = re.search(r'[^/]+(/[^ ]*)', data[0])

        # print(ret )




        if ret:
            file_name = ret.group(1)
            # print('*'*50, file_name)
            真实路径 =file_name
            #print (真实路径,'DDDDDDDDDD')
            if file_name != '':
                f2 = os.path.exists('D:/开机启动/web/web' + file_name)

                if f2 == True:


                    file_name = file_name
                else:
                    if file_name == '/':
                        file_name = '/index.html'
                    else:
                        file_name = '/index.html'



            def rex(r):

                html_content=r.encode('GBK')

                response = 'HTTP/1.1 200 OK\r\n'
                response += '\r\n'
                new_socket.send(response.encode('GBK'))
                new_socket.send(html_content)
                new_socket.close()

                # 等于Msg调用模块
            if 真实路径.endswith('.msg'):
                env={
                    'file_name':真实路径,
                }
                内容=通知内容.真实路径(env)
                rex(内容)


                 #等于Line调用模块
            if 真实路径.endswith('.line'):
                env={
                    'file_name':真实路径,
                }
                内容=在线数据.真实路径(env)
                rex(内容)
                

            else:
                try:
                    #  网页文件的路径自己设置
                    f = open('D:/开机启动/web/web' + file_name, 'rb')
                except:
                    response = 'HTTP/1.1 404 NOT FOUND\r\n'
                    response += '\r\n'
                    response += ' '
                    new_socket.send(response.encode('GBK'))
                    # 新进程中关闭套接字
                    new_socket.close()

                else:
                    html_content = f.read()
                    f.close()
                    # ww='jijiiih数据转为可以'
                    # html_content=ww.encode('gb2312')

                    # 2.1 准备发送给浏览器的数据---header
                    response = 'HTTP/1.1 200 OK\r\n'
                    response += '\r\n'
                    # 2.2 准备发送给浏览器的数据---boy
                    # response += 'hahahhah'

                    # 将response header发送给浏览器
                    new_socket.send(response.encode('GBK'))
                    # 将response body发送给浏览器
                    new_socket.send(html_content)
                    # 新进程中关闭套接字
                    new_socket.close()


                ######################################################



        # 2. 返回http格式的数据,给浏览器




        数据 = data
        print(数据)
        str1 = (str(数据))  # 定义数据类型
        str1 = str(str1)
        list1 = str1.split(' ')
        str2 = (str(list1[1]))
        str2 = str(str2)
        网址 = parse.unquote(str2)

        #print(网址)
        if ('/⧭Rex' in 网址):
            listRex = 网址.split('⧭')
            msg.se(listRex[2],listRex[3], listRex[4])

        if ('/logger' in 网址):

            list2 = 网址.split('⧭')  # 进行分割
            # print(list2[1]) #包名
            # print(list2[2]) #名称
            # print(list2[3]) #内容

            sms = (str(list2[3])[0:-19])

            if sms[0] == '[':
                r1 = sms.index(']')  # 检查]在字符串什么位置
                r2 = (sms[r1 + 1:])

                r3 = r2.index(':')  # 检查]在字符串什么位置
                发信名称 = (r2[:r3])  # 得出发信名称
                list2[3] = (r2[r3 + 2:])  # 发送内容
            else:
                if (':' in sms):
                    r5 = sms.index(':')
                    发信名称 = (sms[:r5])  # 得出发信名称
                    list2[3] = (sms[r5 + 2:])  # 发送内容
                else:
                    发信名称 =list2[2]
                    需要转换字符串内容=str(list2[3])
                    第一部分内容= 需要转换字符串内容.split(' ')
                    list2[3]=第一部分内容[0]


                
            

            
            检查发信人 = os.path.exists('D:/开机启动/web/web/' + list2[1] + '/' + list2[2]+'.py')
            if 检查发信人 == True:  # 文件夹没有找到
                conn = pymysql.connect(host='i.rex-robot.com', user='root', password='Rex888888', database='rex', charset='GBK')
                cursor = conn.cursor()
                #获取名称记录 = 'SELECT * FROM line WHERE 名称= '999999#' and 使用名='888888#'' 
                获取名称记录 = 'SELECT * FROM line WHERE 名称 = '999999#'' 
                替换字符串 = (获取名称记录.replace('999999#', list2[2]))
                替换记录1 = cursor.execute(替换字符串)
            
                for i in range(替换记录1):
                    替换记录2 = (cursor.fetchone())
                    if (str(替换记录2[2]) in sms):
                        发信名称 ='Rex'
                conn.commit()
                # 关闭光标
                cursor.close()
                # 关闭连接 conn.cu
                conn.close()

            else:
                conn = pymysql.connect(host='i.rex-robot.com', user='root', password='Rex888888', database='rex', charset='GBK')
                cursor = conn.cursor()
                #获取名称记录 = 'SELECT * FROM line WHERE 名称= '999999#' and 使用名='888888#'' 
                获取名称记录 = 'SELECT * FROM line WHERE 名称 = '999999#'' 
                替换字符串 = (获取名称记录.replace('999999#', 'Rex'))
                替换记录1 = cursor.execute(替换字符串)
            
                for i in range(替换记录1):
                    替换记录2 = (cursor.fetchone())
                    if (str(替换记录2[2]) in sms):
                        发信名称 ='Rex'
                conn.commit()
                # 关闭光标
                cursor.close()
                # 关闭连接 conn.cu
                conn.close()


            

            if 发信名称 == 'Rex':

                #print('   ' + list2[1] + '    ' + list2[2] + '    ' + list2[3])
                f1 = os.path.exists('D:/开机启动/web/web/' + list2[1])
                #print(f1)
                if f1 == True:
                    #print('找到文件夹')
                    f2 = os.path.exists('D:/开机启动/web/web/' + list2[1] + '/' + list2[2] + '.py')
                    if f2 == True:  # 文件夹没有找到
                        win32api.ShellExecute(0, 'open', 'D:/开机启动/web/web/' + list2[1] + '/' + list2[2] + '.py', '', '',
                                              1)  # 运行程序
                        conn = pymysql.connect(host='i.rex-robot.com', user='root', password='Rex888888', database='rex', charset='GBK')
                        cursor = conn.cursor()
                        sql = 'INSERT INTO sms ( 类型,消息 ) VALUES ('8888','9999');'
                        sql1 = (sql.replace('8888', list2[2]))
                        sql2 = (sql1.replace('9999', list2[3]))
                        cursor.execute(sql2)
                        conn.commit()
                        # 关闭光标
                        cursor.close()
                        # 关闭连接 conn.cu
                        conn.close()
                        # print ('找到文件')


                    else:
                        未找到ID消息 = 'ID: ' + list2[1] + ' 用户 ' + list2[2] + ' 内容: ' + list2[3]
                        if ('[发送文件]' in 未找到ID消息):
                            msg.se('1001', '[发送消息]' + 'ID: ' + list2[1] + ' 用户 ' + list2[2] + ' 内容:' + ' 文件消息', '1')
                        else:
                            f8 = os.path.exists('D:/开机启动/web/web/' + list2[1] + '/' + '未找到用户.py')
                            if f8 == True:  # 文件夹没有找到
                                conn = pymysql.connect(host='127.0.0.1', user='root', password='Rex888888', database='rex', charset='GBK')
                                cursor = conn.cursor()
                                sql = 'INSERT INTO sms ( 类型,消息 ) VALUES ('8888','9999');'
                                sql1 = (sql.replace('8888', '未找到用户'))
                                sql2 = (sql1.replace('9999', ' 用户 ' + list2[2] + ' 内容:' + list2[3]))
                                cursor.execute(sql2)
                                conn.commit()
                                # 关闭光标
                                cursor.close()
                                # 关闭连接
                                conn.close()
                                win32api.ShellExecute(0, 'open', 'D:/开机启动/web/web/' + list2[1] + '/' + '未找到用户.py', '',
                                                      '', 1)  # 运行程序
                            else:
                            
                                #msg.se('1001', '[发送消息]' + 未找到ID消息, '1')
                                # print ('文件夹找到了  文件找不到')
                                pass
                else:

                    未找到程序消息 = '应用: ' + list2[1] + ' 用户 ' + list2[2] + ' 内容: ' + list2[3]
                    if ('[发送文件]' in 未找到程序消息):
                        #msg.se('1001', '[发送消息]' + '应用: ' + list2[1] + ' 用户 ' + list2[2] + ' 内容: ' + '文件消息', '1')
                        pass
                    else:
                   
                        #msg.se('1001', '[发送消息]' + 未找到程序消息, '1')
                        pass


    def main():

        # 初始化套接字
        tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 1、绑定端口
        tcp_server.bind(('', 8888))
        # 2、设置监听
        tcp_server.listen(128)

        while True:
            # 3、等待接收
            new_server, client_adder = tcp_server.accept()
            # 4、响应
            threading.Thread(target=response, args=(new_server,)).start()
            # 5、关闭新套接字------此处关闭会导致新套接字无法正常使用
            # new_server.close()
        # 6、关闭服务器套接字
        tcp_server.close()


    if __name__ == '__main__':
        main()
Python 实现简单 Web 服务器:使用 PidFile 加锁

原文地址: https://www.cveoy.top/t/topic/mzYi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录