下图是关于client下载文件的粗略思路,如果看不懂没有关系(反正这是画给我自己看的),
假装说明一下:
关于客户端下载功能,client端要做的事情有几件:
1.发送一个下载命令道客户端,比如 cmd =‘get apple.txt‘
2.client要接受server对于cmd请求的返回,并获得apple.txt文件的大小,为什么要知道文件的大小?因为这要涉及到socket的粘包问题
server简单
端:
1.第一次recv 客户端的cmd命令
2.第一次send文件的大小给client端
3.第二次recv 客户端的确定命令(防止server发送的粘包)
3.第二次send文件到客户端 (结束)
过程演练一:
client:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2018/8/1 15:18
# @Author : jerry
# @Site :
# @File : ftp_client.py
# @Software: PyCharm
from setting import config
import socket
# Addrs='127.0.0.1'
# Port=4336
Addrs=config.serverhost['ADDR']
Port=config.serverhost['Port']
client=socket.socket()
client.connect((Addrs,Port))
while True:
cmd=input("请输入get 某个文件, 列如 get apple.txt>>:").strip()
if not cmd: continue #防止不输入字节后,卡死
client.send(cmd.encode()) #第一次发送消息
totsize=client.recv(1024) #第一次reve
totsize=int(totsize.decode())
print(totsize)
filename=cmd.split()[1]
f=open('/usr/'+filename,'wb')
client.send(b'ok ,get it')
receve_size=0
while receve_size<totsize:
if totsize - receve_size > 1024:
size=1024
else:
size=totsize-receve_size
data=client.recv(size)
receve_size+=len(data)
f.write(data)
f.close()
server:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2018/8/1 15:13
# @Author : jerry
# @Site :
# @File : ftp_server.py
# @Software: PyCharm
import socket,os
from setting import config
server=socket.socket()
Addrs=config.serverhost['ADDR']
Port=config.serverhost['Port']
server.bind((Addrs,Port))
server.listen(3)
print('开始请求了')
#让server一直挂起见到port 端口 所以需要用一个while 循环来监听新来的conn
while True:
conn,addr=server.accept()
while True:
client_cmd=conn.recv(1024) #第一次接受到的客户端请求
if not client_cmd:
print("客户端已经断开")
break
print(client_cmd)
filename=client_cmd.split()[1]
print(filename)
if os.path.isfile(filename):
totsize=str(os.stat(filename).st_size).encode()
conn.send(totsize) #发送下载的filename大小给client #第一次send
second_cmd=conn.r