实验要求
- 设计一个信息系统,系统必须通过客户端录入账号口令远程登录;
- 系统内至少包含三个以上账号;
- 系统服务器端可设定禁止登录的IP地址和账号信息;
- 如果客户端从禁止的IP地址登录或使用禁止的账号登录则显示不允许登录,并断开连接。
所用知识
- python语法基础
熟悉Python语法,重点掌握if elif语句、存在判断、列表及其方法、字符串及其方法、字典 和 文件操作等。
用到的书籍:《python基础教程》
提取码:d8yo
- socket网络编程
整个代码按照socket套接字基本编程流程编写即可:
用到的书籍:《python核心编程》
提取码:wkfj
可参考的视频:socket网络编程
详细思路
实验按照题目分为“创建客户端服务端“和“实现防火墙”两步,考虑到Python语言比较简单,所以选用了Python来完成这次实验
- 创建客户端服务端
创建客户端和服务端时必须使用socket套接字来实现,套接字就相当于网线,将两台电脑连接起来,在这里就是将客户端服务端连接起来,实现最简单的即时通讯。
客户端服务端有TCP和UDP两种,考虑到TCP比较安全稳定,数据不会丢失,所以我们选用了TCP客户端和服务器。
查阅资料得知,服务端的创建必须经过创建socket套接字、绑定IP和端口信息(bind),监听(listen)以及发送数据(send)、接收数据(recv)和关闭服务器(close)这六部分组成
而客户端则只需要创建套接字、连接服务器(connect)、发送数据、接收数据和关闭(close)这五部分组成
需要特别指出的是,每一次send发送数据,都必须有对应的recv来接收数据,而且由于输入的数据是字符串类型,而send和recv都是字节型,因此在每次发送时都必须用encode编码,接收数据时用decode解码。
这样以来,客户端和服务端就建立成功了。
- 创建防火墙
在客户端服务端创建好后,就开始考虑防火墙了。
防火墙是通过对指定账户以及指定IP地址的拦截,让其无法连接到服务器,达到防火墙效果的。
我们想到在服务端定义一个禁止登陆的账户密码字典,以及一个禁止登陆的IP。
在用户用客户端连接服务器,输入账户密码时,将账户密码信息发送到服务端,服务端将接收的账户密码信息或IP地址与已经定义好的禁止登陆信息进行匹配,如果匹配成功且密码正确,将主动断开客户端的连接(close),并向其发送“该账户或IP禁止登陆”的信息,打印在屏幕上。
如果账户密码正确且未被禁止,将成功和服务器进行连接,开始进行信息交互(while True)。
这样就实现了防火墙的功能。
代码实现
1、服务器
#服务端
import socket
user = {
"admin": "1234"}
limitUser = {
} #限制登录的用户及密码
limitIp = [] #限制登录的IP地址
#读取限制的账户密码
with open(r"limit_user.txt", "r") as f:
for line in f.readlines():
limitUser[line.split()[0]] = line.split