[python]-socket之ftp实现

下图是关于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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值