服务器端:

#coding:utf-8
'''
ServerGui.py
设置比赛开始时间
设置比赛结束时间
若时间无误启动监听服务
'''
import time
import re
import tkinter as tk
from tkinter import simpledialog
from DenyServer import *
import threading

class ServerGui():

    def __init__(self):
        '''开始时间,结束时间'''
        self.getEndTime = ''
        self.getStartTime = ''
        '''定义窗口布局'''
        self.root = tk.Tk()
        self.serverMark = 1
        self.root.title('404监考服务器')
        self.curWidth = 450
        self.curHeight = 85
        scnWidth,scnHeight = self.root.maxsize()
        tmpcnf = '%dx%d+%d+%d'%(self.curWidth,self.curHeight,
                                (scnWidth-self.curWidth)/2,(scnHeight-self.curHeight)/2)
        self.root.geometry(tmpcnf)
        self.root.resizable(False, False)
        '''比赛开始时间Button'''
        self.setStartTimeButton = tk.Button(self.root,
                                       text='设置比赛开始时间:',
                                        height=1,width=15,padx=8,pady=1,
                                        font=("Arial",14),
                                        command=self.setStartTime)
        self.startTimeLable = tk.Label(self.root,text='00:00:00',font=("Arial",20))
        self.setStartTimeButton.grid(row=0,column=0,stick=tk.E)
        self.startTimeLable.grid(row=0,column=1,stick=tk.W)
        '''比赛结束时间Button'''
        self.setTimeButton = tk.Button(self.root,
                                       text='设置比赛结束时间:',
                                        height=1,width=15,padx=8,pady=1,
                                        font=("Arial",14),
                                        command=self.setEndTime)
        self.timeLable = tk.Label(self.root,text='00:00:00',font=("Arial",20))
        self.setTimeButton.grid(row=1,column=0,stick=tk.E)
        self.timeLable.grid(row=1,column=1,stick=tk.W)

        '''启动服务器'''
        if self.serverMark:
            self.threadStartServerServices = threading.Thread(target=self.checkTimeAndLocaltion)
            self.threadStartServerServices.start()

        self.root.mainloop()
    '''检查时间是否设置'''
    def checkTimeAndLocaltion(self):
        while True:
            if self.getEndTime != '' and self.getStartTime != '':
                self.serverStart()
                break
            time.sleep(1)
    '''设置比赛开始时间'''
    def setStartTime(self):
        ch = simpledialog.askstring("比赛开始时间:", "时间格式例如:2017-07-12 00:00:15")
        pattern=re.compile(r'(\d{4}-\d{2}-\d{2})((\s\d{2}:\d{2}:\d{2}|))')
        try:
            s = pattern.search(ch).group()
            self.getStartTime = s
            self.startTimeLable.configure(text=s)
        except AttributeError:
            tk.messagebox.showerror('警告', "格式错误")
            self.setStartTime()
        except TypeError:
            pass
    '''设置比赛结束时间'''
    def setEndTime(self):
        ch = simpledialog.askstring("比赛结束时间:", "时间格式例如:2017-07-12 00:00:15")
        pattern=re.compile(r'(\d{4}-\d{2}-\d{2})((\s\d{2}:\d{2}:\d{2}|))')
        try:
            s = pattern.search(ch).group()
            self.getEndTime = s
            self.timeLable.configure(text=s)
        except AttributeError:
            tk.messagebox.showerror('警告', "格式错误")
            self.setEndTime()
        except TypeError:
            pass
    '''启动服务器端'''
    def serverStart(self):
        self.serverMark = 0
        '''模块接口'''
        server = ThreadTCPServer(initServerIp(), TCPHandler)
        TCPHandler.startTime = datetime.datetime.strptime(self.getStartTime, "%Y-%m-%d %H:%M:%S")
        TCPHandler.endTime   = datetime.datetime.strptime(self.getEndTime,   "%Y-%m-%d %H:%M:%S")

        server_thread = threading.Thread(target=server.serve_forever())
        server_thread.daemon = True
        server_thread.start()
        server_thread.join()
        server.shutdown()

if __name__ == '__main__':
    servergui = ServerGui()
#coding:utf-8
'''
DenyServer.py
使用socketserver创建一个服务器端(用前辈的模块,不如自己写的灵活,导致很多功能在接口处卡死)
'''
from socket import *
import threading
import socketserver
import datetime
import logging
from DenyItem.ServerGui import *

class TCPHandler(socketserver.BaseRequestHandler):

    '''处理request请求'''
    def handle(self):  

        self.BUFSIZE = 1024
        self.version = '
        self.clientIP = []
        '''获取request数据并删除头尾空格'''
        self.data = self.request.recv(self.BUFSIZE).strip().decode('utf-8')
        self.senddata = ''
        '''配置日志格式'''
        logging.basicConfig(level=logging.DEBUG,
                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s :%(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S',
                filename='Serverlog.log',
                filemode='a')
        '''记录日志'''
        logging.info("{} send:" .format(self.client_address[0]) + str(self.data))
        '''响应客户端请求'''
        if self.data[0] == 'B':
            self.beginTime = self.data[2:]
            self.beginTime = datetime.datetime.strptime(self.beginTime,'%Y-%m-%d %H:%M:%S')
            if self.endTime == '' :
                self.senddata = '
            elif self.startTime <= self.beginTime:
                self.senddata = '-2'
            elif self.beginTime >= self.endTime:
                self.senddata = '-1'
            else:
                self.senddata = self.endTime
        elif self.data[0] == 'E':
            '''报警模块'''
            '''BUG,获取IP'''

            if self.data[-3] == '.':
                self.id = int(self.data[-2:])
                logging.error('502 IP:' + str(self.id) + '号,正在作弊!!!')
            else:
                self.id = int(self.data[-3:]) - 110
                logging.error('404:' + str(self.id) + '号,正在作弊!!!')
        elif self.data[0] == 'V':
            if self.data[-1:] == self.version:
                self.senddata = '
            else:
                self.senddata = '-1'
        elif self.data[:2] == 'IP':
            '''更新上线列表'''
            if self.data[-3] == '.':
                '''502IP未定'''
                '''502IP未定'''
                '''502IP未定'''
                logging.info('502 上线:' + self.data[-2:])
            else:
                logging.info('404 上线:' + str(int(self.data[-3:])-110))

        self.request.sendall(str(self.senddata).encode('utf-8'))

class ThreadTCPServer(socketserver.ThreadingMixIn,socketserver.TCPServer):
    pass

def initServerIp():
    ADDR = HOST, PORT = gethostbyname(gethostname()), 1122
    return ADDR

if __name__=='__main__':

    server = ThreadTCPServer(initServerIp(), TCPHandler)
    TCPHandler.endTime = datetime.datetime.strptime('2017-7-27 20:00:00', "%Y-%m-%d %H:%M:%S")
    server_thread = threading.Thread(target=server.serve_forever())
    server_thread.daemon = True
    server_thread.start()
    server_thread.join()
    server.shutdown()

python--DenyHttp项目(2)--ACM监考服务器端的更多相关文章

  1. Github上的python开源项目

    Python开源项目,期待大家和我们一起共同维护 github排名榜单 https://github.com/trending github搜索榜单:https://github.com/search ...

  2. Pycharm+django新建Python Web项目

    这两天初学Python,首先是学习Python语法有PyCharm就可以运行Console程序了,因为是初学所以,尽量写的比较详细,包括参考的资料地址...   1.下载Python,并安装[本文版本 ...

  3. Python(Django)项目与Apache的管理

    (开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python).Apache.Wsgi(必须文件) 首先需要电脑有Pytho ...

  4. Python(Django)项目与Apache的管理交互

    (开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python).Apache.Wsgi(必须文件) 首先需要电脑有Pytho ...

  5. 再一波Python实战项目列表

    前言: 近几年Python可谓是大热啊,很多人都纷纷投入Python的学习中,以前我们实验楼总结过多篇Python实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...

  6. 使用Nginx+Uwsgi部署Python Flask项目

    第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...

  7. 机器学习 Top 20 Python 开源项目

    转自:http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652565022&idx=1&sn=9aa035097120 ...

  8. python实战===2017年30个惊艳的Python开源项目 (转)

    本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...

  9. 10大Python开源项目推荐(Github平均star2135)

    翻译 | suisui 来源 | 人工智能头条(AI_Thinker) 继续假日充电系列~本文是 Mybridge 挑选的 10 个 Python 开源项目,Github 平均star 2135,希望 ...

随机推荐

  1. 压缩网站的css和js,合并多个文件到一个文件

    压缩网站的css和js,合并多个文件到一个文件uglifyjs index.js html5shiv.min.js -o all.min.jsuglifycss index.min.css web.c ...

  2. 探索Windows命令行系列(4):通过命令管理文件和文件夹

    1.文件夹操作 1.1.DIR(directory)命令 1.2.TREE 命令 1.3.CD(change directory)命令 1.4.MD(make directory)命令 1.5.RD( ...

  3. 一起学习c++11——c++11中的新增的容器

    c++11新增的容器1:array array最早是在boost中出现:http://www.boost.org/doc/libs/1_61_0/doc/html/array.html 当时的初衷是希 ...

  4. 4.jsp的内置对象

    1.jsp有九大内置对象 out request response session application page pagecontext exception config 2.用户发请求 requ ...

  5. Nio经典工作方式

    public void selector() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1024); Selector ...

  6. 使用vue实现tab操作

    在使用jQuery类库实现tab功能时,是获取鼠标在mousenter或click时的index值,然后切换到当前的标题和内容,把其他的标题和内容的状态去掉: $('.tab .title').fin ...

  7. RabbitMQ插件安装

    RabbitMQ的有些插件没有集成在初始的安装中,它们需要额外安装,这些文件的后缀为.ez,安装时需要将.ez文件拷贝到安装的插件目录.以下是不同系统中默认安装的插件目录路径: 插件目录 Linux ...

  8. (转载)开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !

    文章链接:http://justcoding.iteye.com/blog/2110275 CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的 ...

  9. 初学c语言

    虽然有一点点基础,但是还是从头学吧,这一周也就一些c语言的几个代码代表的意思和一个Hello world的程序. #include是头文件名,<>这是要返回的函数类型,然后是main主函数 ...

  10. 我的学习之路_第二十九章_bootstrap

    bootstrap 内置了html,css,js插件为一体的前端框架 响应式布局: 设计一套页面就可以使用于很多现实设备 bootstrap: 1.入门(响应式布局的容器) 1.先进入jQuery的j ...