python--DenyHttp项目(2)--ACM监考服务器端
服务器端:
#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监考服务器端的更多相关文章
- Github上的python开源项目
Python开源项目,期待大家和我们一起共同维护 github排名榜单 https://github.com/trending github搜索榜单:https://github.com/search ...
- Pycharm+django新建Python Web项目
这两天初学Python,首先是学习Python语法有PyCharm就可以运行Console程序了,因为是初学所以,尽量写的比较详细,包括参考的资料地址... 1.下载Python,并安装[本文版本 ...
- Python(Django)项目与Apache的管理
(开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python).Apache.Wsgi(必须文件) 首先需要电脑有Pytho ...
- Python(Django)项目与Apache的管理交互
(开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python).Apache.Wsgi(必须文件) 首先需要电脑有Pytho ...
- 再一波Python实战项目列表
前言: 近几年Python可谓是大热啊,很多人都纷纷投入Python的学习中,以前我们实验楼总结过多篇Python实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...
- 使用Nginx+Uwsgi部署Python Flask项目
第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...
- 机器学习 Top 20 Python 开源项目
转自:http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652565022&idx=1&sn=9aa035097120 ...
- python实战===2017年30个惊艳的Python开源项目 (转)
本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...
- 10大Python开源项目推荐(Github平均star2135)
翻译 | suisui 来源 | 人工智能头条(AI_Thinker) 继续假日充电系列~本文是 Mybridge 挑选的 10 个 Python 开源项目,Github 平均star 2135,希望 ...
随机推荐
- Latex: 插入数学公式
write equations align equations to left To only align one equation, you can \begin{flalign} &\te ...
- CSS 浅析position:relative/absolute定位方式
## 一.position:relative 相对定位 ## 分两种情况分析: · 无 position: relative: · 有 position: relative. 代码如下图: 显示效果如 ...
- SQL检测开始日期 结束日期 是否存在交叉
检测开始日期 结束日期 是否存在交叉 "+tj+" and ((starttime>="+starttime+" and starttime<=&q ...
- 国内互联网公司github网址
-----------------------------------------------------推荐技术------------------------------------------- ...
- Linux终端类型
unix是一个多用户多任务的操作系统.早期电脑昂贵,所以当时使用便宜的设备连接到电脑上(当时还没有键盘和显示器,使用纸带和卡片来输入输出)来使用操作系统,这个便宜的设备就是终端,也可以认为终端是一种控 ...
- 【Android Developers Training】 80. 管理网络使用
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- date时间转换
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/h ...
- pouchdb-find( pouchdb查询扩展插件 ,便于查询)
pouchdb-find pouchdb-find 环境搭建 下载lib bower install pouchdb-find 引入js <script src="pouchdb.js ...
- 【Socket】Java Socket基础编程
Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...
- c# MySqlHelper_ExecuteSqlTran
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text;u ...