为更好地保证教学质量和提高学生的学习积极性,我使用Python开发了一套课堂教学管理系统,具有在线点名、在线答疑、随机提问、在线作业管理、在线自测、在线考试、数据汇总、试卷生成、屏幕广播等功能,前几天又增加了远程关机功能。教师端运行界面如下图所示:
学生端运行界面如下图所示:
该系统投入使用已有4个学期,效果非常好,不仅可以满足上课的各种需要,还可以作为“Python程序设计”课程的一个完整教学案例讲给学生,适用教材包括《Python程序设计基础》(董付国编著,清华大学出版社)、《Python程序设计(第2版)》(董付国编著,清华大学出版社)、《Python可以这样学》(董付国著,清华大学出版社)。本文重点介绍局域网内远程关机功能的技术要点,系统界面使用tkinter编写,教师端使用UDP协议向局域网内所有主机广播关机指令,同时所有学生端监听UDP端口,收到关机指令后关闭本地计算机。文中略去了有关标准库和扩展库的导入代码。
1、学生端启动之后,创建Socket并监听特定端口,如果收到屏幕广播指令就启动接收广播屏幕的线程,如果收到关机指令就关闭本地计算机。代码目前只考虑了Windows平台,其他系统可以在此基础上自行扩展。
# 使用UDP监听,等待服务器的广播指令
def udpListen():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 监听本机10000端口
sock.bind(('',10000))
while True:
data, addr = sock.recvfrom(100)
# 收到服务器发来的广播指令
if data == b'startBroadCast':
threading.Thread(target=receiveBroadCast).start()
elif data == b'shutdown':
import platform
if platform.platform().startswith('Windows'):
command = r'shutdown /s /f'
os.system(command)
sock.close()
threading.Thread(target=udpListen).start()
2、教师在下课后单击教师端软件界面上的“关闭所有学生机器”按钮,向局域网内所有计算机发送关机指令。
def onbuttonShutdownClick():
result = tkinter.messagebox.askyesno('远程关机',\
'确定要关闭所有学生机器吗?')
if result == tkinter.YES:
# 通知客户端关机
sock = socket.socket(socket.AF_INET,\
socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET,\
socket.SO_BROADCAST, 1)
IP = serverIP[:serverIP.rindex('.')]+'.255'
sock.sendto(b'shutdown', (IP, 10000))
buttonShutdown = tkinter.Button(root,\
text='关闭所有学生机器',\
command=onbuttonShutdownClick)
buttonShutdown.place(x=240, y=340, width=100, height=30)
单击教师端界面上的“关闭所有学生机器”之后,会弹出确认按钮,单击“是”之后,会关闭局域网内所有计算机。