socket实现的简单的ftp服务

Posted Alan_chow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket实现的简单的ftp服务相关的知识,希望对你有一定的参考价值。

用 socket实现简单的ftp服务
ex:服务端
 1 import socket,os
 2 server=socket.socket()
 3 server.bind(("localhost",6969))#绑定要监听端口
 4 server.listen()#监听
 5 print("等待操作命令")
 6 while True:#开始接电话
 7     conn, addr = server.accept()  # 等电话打进来
 8     # conn 就是客户端连接过来,服务端为其生成的一个连接实例
 9     print("命令来了",addr)
10     while True:
11         data=conn.recv(1024)#接收,接收的包大小最大是1024个字节(最大8192),改小这个值,将出现未接收完的数据,
12         # 还在缓存区中,下次执行会先发送出来.(改大buff解决不了问题)。方案:先告诉客户端要发送多少数据,让客户端
13         #校验,完全接收数据
14         if not data:#判断是否有数据发送进来
15             print("客户端已断开")
16             break
17         print("执行命令%s"%data)
18         cmd_res=os.popen(data.decode()).read()
19         if len(cmd_res)==0:
20             cmd_res = "命令错误"   # 命令错误时给客户端发回信息内容
21         conn.send(str(len(cmd_res.encode(utf-8))).encode(utf-8))#先发大小,第一个encode是因为
22         # 中文字段占三个字节,需要先转换码,才是真正的长度,否则出现长度判断错误
23         client_ack = conn.recv(1024)  # 客户端回馈,避免粘包
24         conn.send(cmd_res.encode(utf-8))#接收后,发送
25 server.close()

ex:客户端

 1 import socket
 2 client=socket.socket()#声明socket类型,同时生成连接对象
 3 client.connect((localhost,6969))
 4 
 5 while True:
 6     cmd=input(">>:").strip()
 7     if len(cmd)==0:#当输入的消息是空时,不发送,等待输入非空后再发送
 8         continue
 9     client.send(cmd.encode("utf-8"))
10     cmd_res_size=client.recv(1024)#接收服务端命令的长度
11     client.send("客户端准备完毕,请发送新命令".encode(utf-8))#相应服务端,避免粘包
12     recevied_size=0#定义一个空字节,用于后续循环接收判断是否接收完,跳出循环
13     recevied_data=b‘‘
14     while recevied_size<int(cmd_res_size.decode()):#循环收返回的数据
15         data=client.recv(1024)
16         recevied_size+=len(data)#每次收到的数据不是刚刚是1024字节,所有必须判断
17         recevied_data+=data
18     print(recevied_data.decode())
19 client.close()

 



以上是关于socket实现的简单的ftp服务的主要内容,如果未能解决你的问题,请参考以下文章

ftp服务器的简单实现——服务器端

ftp服务器的简单实现——客户端

socket实现两台FTP服务器指定目录下的文件转移(不依赖第三方jar包)

简单的单进程FTP服务器的实现

FTP Proxy Server

01 ftp上传简单示例服务端