import socket
import select
import sys
import datetime
# 范围时间
# 根据指定的格式将一个时间字符串解析为时间元祖用于比价
start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + '7:30','%Y-%m-%d%H:%M')
end_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + '23:00','%Y-%m-%d%H:%M')
# 当前时间
now_time = datetime.datetime.now()
# 判断当前时间是否在范围时间内
if now_time >= start_time and now_time <= end_time:
to_addr = ('192.168.43.189', 6000) # Ftp 服务器地址
class Proxy:
def __init__(self, addr):
# 创建 socket 实例,指定面向网络,面向连接
self.proxy = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.proxy.bind(addr) # 绑定代理地址到套接字
self.proxy.listen(10) # 开启 TCP监听,设置最大连接数为 10
self.inputs = [self.proxy] # socket 列表
self.route = {} # 建立 客户端:服务端的连接,也就是将对应的socket绑定起来
# 代理监听服务
def proxy_serve(self):
print('--------------- FTP 代理监听开始 ---------------')
while True:
# 三个参数,第一个所有输入的data即外部发过来的数据,第二个监控和接收所有要发出去的data,第三个监控错误信息
readable, _, _ = select.select(self.inputs, [], [])
for self.sock in readable: # 判定所有接受的套接字
if self.sock == self.proxy: # 是指向代理的连接
self.connect_on()
else:
data = self.sock.recv(100000) # 接受发送过来的TCP数据,数据以字符串形式返回,8096表示字节大小
if not data:
self.quit_on() # 不存在数据则关闭这个 socket 套接字
else:
self.route[self.sock].send(data)
def connect_on(self):
client, addr = self.proxy.accept() # 建立客户端的连接
print('--客户端与服务端连接成功--')
forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 实例化一个该客户端的对象
forward.connect(to_addr) # 与服务器建立连接
self.inputs += [client, forward] # 新建立的 socket 加入 inputs 列表
# 建立客户端和服务端的对应
self.route[client] = forward
self.route[forward] = client
def quit_on(self):
for s in self.sock, self.route[self.sock]:
self.inputs.remove(s) # 移除套接字
del self.route[s]
s.close()
if __name__ == '__main__':
try:
Proxy(('192.168.43.197',4500)).proxy_serve() # 代理服务器监听的地址
except KeyboardInterrupt: # 执行中断操作:Ctrl + C
sys.exit(1)
else:
print("您好,FTP 每天的连接时间为上午7:30 - 23:00")
Pyhton:FTP代理端实现
最新推荐文章于 2021-02-09 02:45:17 发布