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

 



posted on 2017-10-31 17:34  Alan_chow  阅读(2281)  评论(0编辑  收藏  举报

导航