python 实现ftp客户端和服务端
实现一个ftp客户端和服务端
听起来so easy,我也一直以为很简单。
服务端,不就是起一个socket,监听21端口,等客户端连么,连上了,互相say hello
客户端,不就是连一下服务端的21端口,连上了,给他say hello么?
这有什么?顶多是规定一下命令,服务端,对命令进行一下解析,还有啥??
直到我的业务代码里的FTP挂了,我才发现,图样图森泡。
其实这里东西还挺多的
现在简单的记录一下
*****这里是分割线****** 等我学会markdown,我就换个分割线*******************************
客户端 :
这里肯定会起一个主socket,跟服务端进行FTP 的命令交互,两个线程,一个用来发送报文,一个用来接收服务端的报文,有下边的一坨代码,就够了
import socket
import threading
client_FTP = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
def start_client(client_FTP):
"""
:param client_FTP: 客户端跟服务端链接的socket
:func 接受服务端的响应报文
:return:
"""
client_FTP.connect(("serverIP", 21))
while True:
recv = client_FTP.recv(1024)
print(recv)
def func_send(client_FTP):
"""
:param client_FTP: 客户端跟服务端链接的socket
:func 发送FTP 命令
:return:
"""
while True:
command = input().strip()
client_FTP.sendall(command.encode())
client_thread = threading.Thread(target=start_client,args=(client_FTP))
send_thread = threading.Thread(target=func_send,args=(client_FTP))
client_thread.start()
send_thread.start()
client_thread.join()
send_thread.join()
如果涉及数据传输下载,那肯定是要有数据传输的,这时,是客户端给服务端,发送PORT命令,并携带你的端口号过去,然后服务端会连你这个端口,这里,就需要特殊处理了,你告诉服务端连你1025端口,人家连的时候,你是不是要先起一个socket等人连??
所以,这里伪代码大概是这样
client:PORT 1025 # 发送了PORT 和端口 =>client datasocket=socket(loaclip,1025) #创建数据传输的socket =>client datasocket.listen() #数据传输socket开始监听 服务端的连接 while datasocket.accpet() datasocket.send(....) .......
def func_send(client_FTP):
"""
:param client_FTP: 客户端跟服务端链接的socket
:func 发送FTP 命令
:return:
"""
while True:
command = input().strip()
# 命令预处理
pre_command_handle(command)
client_FTP.sendall(command.encode())
def pre_command_handle(command):
"""
:param command: 要下发的命令
:return:
"""
commandlist = command.split()
if len(commandlist) == 2:
[cmd, param] = commandlist
if cmd == "PORT":
new_data_socket(param)
def new_data_socket(port):
datasocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
datasocket.bind(("localIP",int(port)))
datasocket.listen()
while True:
conn, addr = datasocket.accept()
recvdata = conn.recv(1024)
while recvdata:
print(recvdata)
recvdata = conn.recv(1024)
conn.close()
datasocket.close()
先写到这里,后边慢慢再填充
服务端: