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()

先写到这里,后边慢慢再填充

 

服务端:

posted on 2022-07-05 22:04  超级大懒虫vip  阅读(369)  评论(0)    收藏  举报

导航