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) 编辑 收藏 举报