在python簡單垃圾人員管理的基礎上:https://blog.csdn.net/lfy905805357/article/details/92972172
利用網絡編程,編寫成爲分佈的套接字網絡編程,分客戶端和服務端
在這個過程中,發現原來之前的垃圾人員管理系統中間存在一丟丟小毛病~
網絡編程基礎回顧可以查看:https://blog.csdn.net/lfy905805357/article/details/93399502
再原本代碼類的基礎之上,增添服務端和客戶端,方便套接字socket
1、Staff類
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 19 09:36:16 2019
@author: UnderMask
"""
class Staff:
def __init__(self,name,num,age,sex,birthday):
self.__name=name
self.__num=num
self.__age=age
self.__sex=sex
self.__birthday=birthday
def getNum(self):
return self.__num
def check(self):
return self.__name,self.__num,self.__age,self.__sex,self.__birthday
def display(self):
print(self.__name,self.__num,self.__age,self.__sex,self.__birthday,end=" ")
def modify(self,name,num,age,sex,birthday):
self.__name=name
self.__num=num
self.__age=age
self.__sex=sex
self.__birthday=birthday
class Teacher(Staff):
def __init__(self,name,num,age,sex,birthday,lessonName,StudentList):
super().__init__(name,num,age,sex,birthday)
self.__lessonName=lessonName
self.__StudentList=StudentList
def getStudentList(self):
return self.__StudentList
def check(self):
name,num,age,sex,birthday=Staff.check(self)
return name,num,age,sex,birthday,self.__lessonName,self.__StudentList
def display(self):
Staff.display(self)
print(self.__lessonName,self.__StudentList)
def modify(self,name,num,age,sex,birthday,lessonName):
Staff.modify(self,name,num,age,sex,birthday)
self.__lessonName=lessonName
def addStudent(self,student):
self.__StudentList[student.getNum()]=student
def delStudent(self,num):
del self.__StudentList[num]
class AdministrationStaff(Staff):
def __init__(self,name,num,age,sex,birthday,jobType):
super().__init__(name,num,age,sex,birthday)
self.__jobType=jobType
def check(self):
name,num,age,sex,birthday=Staff.check(self)
return name,num,age,sex,birthday,self.__jobType
def display(self):
Staff.display(self)
print(self.__jobType)
def modify(self,name,num,age,sex,birthday,jobType):
Staff.modify(self,name,num,age,sex,birthday)
self.__jobType=jobType
2、Student類
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 19 09:31:58 2019
@author: UnderMask
"""
#Student類
class Student:
def __init__(self,num,name,sex,major,chinese,math,english):
self.__num=num
self.__name=name
self.__sex=sex
self.__major=major
self.__chinese=chinese
self.__math=math
self.__english=english
def getNum(self):
return self.__num
def modify(self,num,name,sex,major,chinese,math,english):
self.__num=num
self.__name=name
self.__sex=sex
self.__major=major
self.__chinese=chinese
self.__math=math
self.__english=english
def check(self):
return self.__num,self.__name,self.__sex,self.__major,self.__chinese,self.__math,self.__english
def display(self):
print(self.__num,self.__name,self.__sex,self.__major,self.__chinese,self.__math,self.__english)
3、人員管理系統類改動
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 19 09:52:47 2019
@author: UnderMask
"""
from Student import Student
from Staff import Teacher
from Staff import AdministrationStaff
class InformationManagementSystem:
def __init__(self,userName,password):
self.__userName=userName
self.__password=password
self.__staff={}
self.__student={}
def getStaff(self,num):
if self.__staff[num]:
return self.__staff[num]
def getStudent(self,num):
if self.__student[num]:
return self.__student[num]
def showMenu(self):
return " 1)教職工信息錄入\n 2)教職工信息查詢\n 3)教職工信息修改\n 4)教職工信息刪除\n 5)學生信息錄入\n 6)學生信息查詢\n 7)學生信息修改\n 8)學生信息刪除\n 9)教師添加管理學生\n 10)教師減少管理學生\n 11)退出\n請輸入操作選項:"
def log(self,userName,password):
if self.__userName==userName:
if self.__password==password:
str0=str(self.__userName)+"登錄成功,歡迎來到高校信息管理系統"
print(str0)
return True,str0
else:
str1="密碼錯誤!"
print(str1)
return False,str1
else:
str2="用戶名錯誤!"
print(str2)
return False,str2
def TeacherAddStudent(self,teacherNum,studentNum):
if teacherNum in self.__staff.keys() and studentNum in self.__student.keys():#若教師跟學生都已錄入系統內
if isinstance(self.__staff[teacherNum],Teacher):
self.__staff[teacherNum].addStudent(self.__student[studentNum])
return "教師:"+teacherNum+"接手管理學生:"+studentNum+"成功~"
else:
return "非教師無學生管理操作"
else:
return "該編號教師、學生待錄入系統,不能直接操作系統不存在的人員~"
def TeacherDelStudent(self,teacherNum,studentNum):
if teacherNum in self.__staff.keys() and studentNum in self.__student.keys():#若教師跟學生都已錄入系統內
if isinstance(self.__staff[teacherNum],Teacher):
self.__staff[teacherNum].delStudent(studentNum)
return "教師:"+teacherNum+"轉手學生:"+studentNum+"成功~"
else:
return "非教師無學生管理操作"
else:
return "該編號教師、學生待錄入系統,不能直接操作系統不存在的人員~"
def StaffEntry(self,staff):
self.__staff[staff.getNum()]=staff#(key,vale)-->(num,staff)
def StaffCheck(self,num):
ans=""
if num=="all":
for key in self.__staff.keys():
ans+=str(self.__staff[key].check())+"\n"
elif num in self.__staff.keys():
ans+=str(self.__staff[num].check())
else:
ans+="暫無該編號的教職工~"
return ans
def StaffModify(self,num,newName,newNum,newAge,newSex,newBirthday,newMessage):
if num in self.__staff.keys():
if isinstance(self.__staff[num],Teacher):
studentList=self.__staff[num].getStudentList()
del self.__staff[num]
self.__staff[newNum]=Teacher(newName,newNum,newAge,newSex,newBirthday,newMessage,studentList)
return "信息更新成功~"
elif isinstance(self.__staff[num],AdministrationStaff):
self.__staff[newNum]=AdministrationStaff(newName,newNum,newAge,newSex,newBirthday,newMessage)
del self.__staff[num]
return "信息更新成功~"
else:
return "該教職工類型出現錯誤~"
else:
return "不存在該編號的教職工~"
def StaffDelete(self,num):
if num in self.__staff.keys():
del self.__staff[num]
return "教職工:"+num+"刪除成功"
else:
return "不存在該編號的教職工~"
def StudentEntry(self,student):
self.__student[student.getNum()]=student#(key,vale)-->(num,student)
def StudentCheck(self,num):
ans = ""
if num=="all":
for key in self.__student.keys():
ans+=str(self.__student[key].check())+"\n"
elif num in self.__student.keys():
student=self.__student[num]
ans+=str(student.check())+"\n"
else:
ans+="暫無該學號學生~\n"
return ans
def StudentModify(self,num,newNum,newName,newSex,newMajor,newChinese,newMath,newEnglish):
if num in self.__student.keys():
del self.__student[num]
self.__student[newNum]=Student(newNum,newName,newSex,newMajor,newChinese,newMath,newEnglish)
return "信息更新成功~"
else:
return "不存在該編號的學生~"
def StudentDelete(self,num):
if num in self.__student.keys():
del self.__student[num]
return "學生:"+num+"刪除成功"
else:
return "不存在該學號的學生~"
4、Service端實現
#服務器端
import socket
from Student import Student
from Staff import Teacher
from Staff import AdministrationStaff
from InformationManagementSystem import InformationManagementSystem
ip_port=('127.0.0.1',9000)
sk=socket.socket()
sk.bind(ip_port)
sk.listen(5)
conn,address=sk.accept()
system = InformationManagementSystem("user", "user")
# 提前錄一點教職工、學生信息,避免每次運行都需要重新錄入,實際系統可以刪除~以下四行
# 簡單編寫,所以所有類型基本用字符串替代,具體完善可以更改爲正確的數據類型
# 也可以改爲文件錄入一些信息~
system.StudentEntry(Student("1", "小花", "woman", "computer", 40, 90, 80))
system.StudentEntry(Student("2", "小明", "man", "SoftwareEngineering", 30, 98, 70))
system.StudentEntry(Student("3", "小厸", "woman", "computer", 90, 68, 85))
system.StudentEntry(Student("4", "小華", "man", "computer", 77, 68, 75))
system.StaffEntry(Teacher("唐老師", "37", "40", "man", "19780118", "C++", {}))
system.StaffEntry(AdministrationStaff("康老師", "27", "30", "woman", "19880119", "教務科"))
system.TeacherAddStudent("37", "1")
system.TeacherAddStudent("37", "2")
system.TeacherAddStudent("37", "3")
log_flag=False
while True:
if log_flag==False:
conn.sendall(bytes("請輸入用戶名", encoding='utf-8'))
userName=str(conn.recv(1024),encoding='utf-8')
conn.sendall(bytes("請輸入登錄密碼", encoding='utf-8'))
password = str(conn.recv(1024), encoding='utf-8')
flag ,message = system.log(userName, password)
log_flag=flag
conn.sendall(bytes(str(flag), encoding='utf-8'))
conn.sendall(bytes(message, encoding='utf-8'))
else:
while True:
conn.sendall(bytes(system.showMenu(), encoding='utf-8'))
index=str(conn.recv(1024),encoding='utf-8')
if index=="1":
conn.sendall(bytes(" 1)教師信息錄入\n 2)行政人員信息錄入", encoding='utf-8'))
index1 = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入教職工姓名", encoding='utf-8'))
name = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入教職工編號", encoding='utf-8'))
num = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入教職工年齡", encoding='utf-8'))
age = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入教職工性別", encoding='utf-8'))
sex = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入教師生日", encoding='utf-8'))
birthday = str(conn.recv(1024), encoding='utf-8')
if index1 == "1":
conn.sendall(bytes("請輸入教師所授課程", encoding='utf-8'))
lessonName = str(conn.recv(1024), encoding='utf-8')
staff = Teacher(name, num, age, sex, birthday, lessonName, {})
system.StaffEntry(staff)
conn.sendall(bytes("教師信息錄入成功!", encoding='utf-8'))
conn.sendall(bytes(str(staff.check()), encoding='utf-8'))
elif index1 == "2":
conn.sendall(bytes("請輸入行政人員崗位類型", encoding='utf-8'))
jobType = str(conn.recv(1024), encoding='utf-8')
staff = AdministrationStaff(name, num, age, sex, birthday, jobType)
system.StaffEntry(staff)
conn.sendall(bytes("行政人員信息錄入成功!", encoding='utf-8'))
conn.sendall(bytes(str(staff.check()), encoding='utf-8'))
else:
conn.sendall(bytes("輸入有誤!", encoding='utf-8'))
elif index=="2":
conn.sendall(bytes("請輸入查詢的教職工編號(輸入all打印全部教職工信息):", encoding='utf-8'))
number = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes(system.StaffCheck(number), encoding='utf-8'))
elif index=="3":
conn.sendall(bytes("請輸入信息待更新的教職工編號:", encoding='utf-8'))
num = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該教職工的正確姓名", encoding='utf-8'))
newName = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該教職工的正確編號", encoding='utf-8'))
newNum = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該教職工的正確年齡", encoding='utf-8'))
newAge = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該教職工的正確性別", encoding='utf-8'))
newSex = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該教師的正確生日", encoding='utf-8'))
newBirthday = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該教師所授課程/請輸入該職工的正確職務類型", encoding='utf-8'))
newMessage = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes(system.StaffModify(num,newName,newNum,newAge,newSex,newBirthday,newMessage), encoding='utf-8'))
elif index=="4":
conn.sendall(bytes("請輸入待刪除的教職工編號", encoding='utf-8'))
num = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes(system.StaffDelete(num), encoding='utf-8'))
elif index=="5":
conn.sendall(bytes("請輸入學生學號", encoding='utf-8'))
num = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入學生姓名", encoding='utf-8'))
name = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入學生性別", encoding='utf-8'))
sex = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入學生專業", encoding='utf-8'))
major = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入學生語文成績", encoding='utf-8'))
chinese = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入學生數學成績", encoding='utf-8'))
math = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入學生英語成績", encoding='utf-8'))
english = str(conn.recv(1024), encoding='utf-8')
student = Student(num, name, sex, major, chinese, math, english)
system.StudentEntry(student)
conn.sendall(bytes("學生信息錄入操作結束!", encoding='utf-8'))
conn.sendall(bytes(str(student.check()), encoding='utf-8'))
elif index=="6":
conn.sendall(bytes("請輸入查詢的學生學號(輸入all打印全部教職工信息)", encoding='utf-8'))
num = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes(system.StudentCheck(num), encoding='utf-8'))
elif index=="7":
conn.sendall(bytes("請輸入信息待更新的學生學號:", encoding='utf-8'))
num = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該學生的正確編號", encoding='utf-8'))
newNum = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該學生的正確名字", encoding='utf-8'))
newName = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該學生的正確性別", encoding='utf-8'))
newSex = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該學生正確專業", encoding='utf-8'))
newMajor = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該學生語文成績", encoding='utf-8'))
newChinese = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該學生數學成績", encoding='utf-8'))
newMath = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入該學生英語成績", encoding='utf-8'))
newEnglish = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes(system.StudentModify(num,newNum,newName,newSex,newMajor,newChinese,newMath,newEnglish), encoding='utf-8'))
elif index=="8":
conn.sendall(bytes("請輸入待刪除的學生學號", encoding='utf-8'))
num = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes(system.StudentDelete(num), encoding='utf-8'))
elif index=="9":
conn.sendall(bytes("請輸入教師編號", encoding='utf-8'))
teacherNum = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入待添加學生學號", encoding='utf-8'))
studentNum = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes(system.TeacherAddStudent(teacherNum, studentNum), encoding='utf-8'))
elif index=="10":
conn.sendall(bytes("請輸入教師編號", encoding='utf-8'))
teacherNum = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes("請輸入待剔除學生學號", encoding='utf-8'))
studentNum = str(conn.recv(1024), encoding='utf-8')
conn.sendall(bytes(system.TeacherDelStudent(teacherNum, studentNum), encoding='utf-8'))
elif index=="11":
log_flag=False
break
conn.close()
sk.close()
5、Client端
#服務器端
import socket
from Student import Student
from Staff import Teacher
from Staff import AdministrationStaff
from InformationManagementSystem import InformationManagementSystem
ip_port=('127.0.0.1',9000)
sk=socket.socket()
sk.connect(ip_port)
#sk.settimeout(5)
log_flag=False
while True:
if log_flag==False:
print(str(sk.recv(1024), encoding='utf-8'),end=":")
userName=input()
sk.sendall(bytes(userName,encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
password=input()
sk.sendall(bytes(password,encoding='utf-8'))
flag=str(sk.recv(1024), encoding='utf-8')
message = str(sk.recv(1024), encoding='utf-8')
print(message)
if flag=="True":
log_flag=True
else:
while True:
print(str(sk.recv(1024), encoding='utf-8'))
index=input(">>>")
sk.sendall(bytes(str(index),encoding='utf-8'))
if index=="1":
print(str(sk.recv(1024), encoding='utf-8'))
index1 = input(">>>")
sk.sendall(bytes(str(index1), encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
name = input()
sk.sendall(bytes(name, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
num = input()
sk.sendall(bytes(num, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
age = input()
sk.sendall(bytes(age, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
sex = input()
sk.sendall(bytes(sex, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
birthday = input()
sk.sendall(bytes(birthday, encoding='utf-8'))
if index1=="1":
print(str(sk.recv(1024), encoding='utf-8'), end=":")
lessonName = input()
sk.sendall(bytes(lessonName, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index1=="2":
print(str(sk.recv(1024), encoding='utf-8'), end=":")
jobType = input()
sk.sendall(bytes(jobType, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
else:
print(str(sk.recv(1024), encoding='utf-8'))
elif index=="2":
print(str(sk.recv(1024), encoding='utf-8'))
number=input(">>>")
sk.sendall(bytes(number, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index == "3":
print(str(sk.recv(1024), encoding='utf-8'))
num = input(">>>")
sk.sendall(bytes(num, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'),end=":")
newName=input()
sk.sendall(bytes(newName, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newNum = input()
sk.sendall(bytes(newNum, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newAge = input()
sk.sendall(bytes(newAge, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newSex = input()
sk.sendall(bytes(newSex, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newBirthday = input()
sk.sendall(bytes(newBirthday, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newMessage = input()
sk.sendall(bytes(newMessage, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index=="4":
print(str(sk.recv(1024), encoding='utf-8'), end=":")
num = input()
sk.sendall(bytes(num, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index=="5":
print(str(sk.recv(1024), encoding='utf-8'), end=":")
num = input()
sk.sendall(bytes(num, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
name = input()
sk.sendall(bytes(name, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
sex = input()
sk.sendall(bytes(sex, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
major = input()
sk.sendall(bytes(major, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
chinese = input()
sk.sendall(bytes(chinese, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
math = input()
sk.sendall(bytes(math, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
english = input()
sk.sendall(bytes(english, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index=="6":
print(str(sk.recv(1024), encoding='utf-8'), end=":")
num = input()
sk.sendall(bytes(num, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index=="7":
print(str(sk.recv(1024), encoding='utf-8'))
num = input(">>>")
sk.sendall(bytes(num, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newNum = input()
sk.sendall(bytes(newNum, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newName = input()
sk.sendall(bytes(newName, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newSex = input()
sk.sendall(bytes(newSex, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newMajor = input()
sk.sendall(bytes(newMajor, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newChinese = input()
sk.sendall(bytes(newChinese, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newMath = input()
sk.sendall(bytes(newMath, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
newEnglish = input()
sk.sendall(bytes(newEnglish, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index=="8":
print(str(sk.recv(1024), encoding='utf-8'), end=":")
num = input()
sk.sendall(bytes(num, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index=="9":
print(str(sk.recv(1024), encoding='utf-8'), end=":")
teacherNum = input()
sk.sendall(bytes(teacherNum, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
studentNum = input()
sk.sendall(bytes(studentNum, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index=="10":
print(str(sk.recv(1024), encoding='utf-8'), end=":")
teacherNum = input()
sk.sendall(bytes(teacherNum, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'), end=":")
studentNum = input()
sk.sendall(bytes(studentNum, encoding='utf-8'))
print(str(sk.recv(1024), encoding='utf-8'))
elif index=="11":
log_flag=False
break
sk.close()
6、運行效果
7、改進~
代碼冗餘過多,可以提取,然後可以加上多線程~