題目要求:
1、設計一個信息系統,系統必須通過客戶端錄入賬號
2、系統內至少包含3個以上賬號
3、系統服務器可設定禁止登錄的IP地址和賬號信息
4、如果客戶端從禁止的IP地址登錄或使用禁止的賬號則不允許登錄,並斷開連接
思路:實現客戶端遠程登錄服務端用到socket模塊
數據嗅探系統 防火牆系統
python3在發送信息時需要加encode函數編碼,接收消息需要decode函數解碼才能顯示成字符串
數據嗅探服務端代碼:
import socket
import os
#允許登錄的賬號和密碼
user={"admin":"1234"}
#創建套接字
s=socket.socket()
#服務端結束運行時立刻歸還端口
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#綁定服務器地址,端口
s.bind(("",8888))
#開始監聽客戶端請求
s.listen(1)
#保存客戶端請求的信息
sock, ip = s.accept()
print("Client-IP:",ip)
while True:
#接收客戶端發送的賬號和密碼
receive=sock.recv(1024).decode()
#print(receive)
ls=receive.split()
try:
#判斷賬號和密碼是否允許登錄
if user[ls[0]] == ls[1]:
sock.send("登錄成功!".encode())
while True:
#接收客戶端發送的內容
receive = sock.recv(1024).decode()
#print(receive)
if receive == "exit":
break
#輸入包含關鍵字“密碼”的信息
if "密碼" in receive:
print(receive)
else:
sock.send("賬戶或密碼錯誤!".encode())
continue
except:
sock.send("重新輸入:".encode())
continue
break
sock.close()
s.close()
os.system("pause")
數據嗅探客戶端代碼:
import socket
import os
c=socket.socket()
c.connect(("127.0.0.1",8888))
user=input("輸入用戶名和密碼,用空格隔開:")
while True:
#發送賬號和密碼
c.send(user.encode())
#接收服務端發送的信息,python3發送信息需要加encode()
#接收消息需要加decode()
recive=c.recv(1024).decode()
if "成功" in recive:
break
print(recive)
user=input()
print(recive)
while True:
temp=input("輸入發送的內容:")
c.send(temp.encode())
if temp=="exit":
break
c.close()
os.system("pause")
防火牆系統服務端代碼:
import socket
import os
#允許登錄的賬號密碼
user={"Bob":"1234","Jim":"4321","Tom":"1324"}
#禁止登錄的IP
hp=["192.168.1.2"]
print("允許登陸的賬號密碼",user)
print("禁止的IP:",hp)
s=socket.socket()
s.bind(("",8888))
s.listen(1)
sock,ip=s.accept()
print("ip:",ip)
#判斷IP是否合法
if ip[0] in hp:
sock.send(("該IP不允許登錄!").encode())
#接收客戶端發送的賬號和密碼
receive=sock.recv(1024).decode()
print(receive)
ls=receive.split(',')
try:
if user[ls[0]] == ls[1]:
sock.send("登錄成功!".encode())
else:
sock.send("賬戶或密碼錯誤!".encode())
except:
sock.send("禁止的賬號!".encode())
sock.close()
s.close()
os.system("pause")
防火牆系統客戶端代碼:
import socket
import os
#判斷輸入的內容是否合法
while True:
user=input("輸入用戶名和密碼,用逗號隔開:")
t=0
for i in user:
if i==',':
t+=1
if t==1:
break
c=socket.socket()
c.connect(("127.0.0.1",8888))
#發送賬號和密碼
c.send(user.encode())
#接收返回的信息
recive=c.recv(1024)
print(recive.decode())
c.close()
os.system("pause")