前言

今天,我要描述一个FTP的故事

主要内容

嗯,今天主要以阶梯性的形式来做一个FTP项目。

第一步:

我要实现这么一个功能,一个FTP客户端,1个FTP服务端,2端建立连接以后可以进行通讯。

服务端

#!/usr/bin/env python
# -*- coding:utf- -*-
# Author: Leon xie import socket #倒入模块
import json s = socket.socket() #申明网络模式 s.bind(('localhost',)) #绑定 s.listen() #监听 while True:
conn,client_addr = s.accept()
print("got a new conn:",client_addr) #与客户端持续交互
while True:
data = conn.recv()
print("recv data:",data)
data = json.loads(data.decode()) if data.get('action') is not None: #如果是合法的格式
if data['action'] == "put":
#客户端发送文件到服务端
file_obj = open(data["filename"],'wb')
received_size = while received_size <data["size"]:
recv_data = conn.recv()
file_obj.write(recv_data)
received_size += len(recv_data)
print(data['size'],received_size)
else:
print("successfully received file [%s]",data['filename'])
file_obj.close() elif data['action'] == "get":
#客户端下载文件从服务端
pass

客户端

#!/usr/bin/env python
# -*- coding:utf- -*-
# Author: Leon xie import socket
import os
import json client = socket.socket()
client.connect(('localhost',)) while True:
choice = input(">>").strip() if len(choice) == :continue
#解析两条不同的指令 cmd_list = choice.split()
if cmd_list[] == "put":
if len(cmd_list) == :
print("no filename follows after put cmd")
continue filename = cmd_list[] #这个就是文件名了
if os.path.isfile(filename):
file_obj = open(filename,'rb') #二进制格式传输,这样省去了encode
base_filename = filename.split("/")[-]
#print(filename,os.path.getsize(filename))
print(base_filename,os.path.getsize(filename))
#print(file_obj,os.path.getsize(filename))
#告诉对方我要发什么
data_header = {
"action":"put",
"filename":base_filename,
"size":os.path.getsize(filename)
}
#client.send(json.dump(data_header))
client.send(json.dumps(data_header).encode())
#发送
for line in file_obj:
client.send(line) print("----send the file done----") else:
print("file is not valid.")
continue if cmd_list[] == "get":
pass

实现了最简单的文件传输

客户端输出

>>put f:/test.7z
test.7z
----send the file done----
>>

服务端输出


successfully received file [%s] test.7z
												

一个初学者的辛酸路程-FTP-9的更多相关文章

  1. 一个初学者的辛酸路程-python操作SQLAlchemy-13

    前言 其实一开始写blog,我是拒绝的,但是,没办法,没有任何理由抗拒.今天呢,要说的就是如何使用Python来操作数据库. SQLAlchemy SQLAlchemy是Python编程语言下的一款O ...

  2. 一个初学者的辛酸路程-socket编程-8

    前言: 你会发现会网络是多么幸福的事情 主要内容: socket 概念: socket本质上就是2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络通信都是基于 ...

  3. 一个初学者的辛酸路程-Python基础-3

    前言 不要整天沉迷于学习-. 字典 一.我想跟你聊聊字典 1.为何要有字典? 大家有没有想过为什么要有字典?有列表不就可以了吗? 也许大家会这么认为,我给大家举个例子,大家就明白了. 比如说,我通讯录 ...

  4. 一个初学者的辛酸路程-了解Python-2

    前言 blog花了一上午写的,结果笔记本关机了,没有保存,找不到了,找不到了啊,所以说,你看的每一篇blog可能都是我写了2次以上的--.哎!! 代码改变世界,继续......... Python基础 ...

  5. 一个初学者的辛酸路程-初识Python-1

    前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 初识Python 一.它的爸爸是谁 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏 ...

  6. 一个初学者的辛酸路程-依旧Django

    回顾: 1.Django的请求声明周期?   请求过来,先到URL,URL这里写了一大堆路由关系映射,如果匹配成功,执行对应的函数,或者执行类里面对应的方法,FBV和CBV,本质上返回的内容都是字符串 ...

  7. 一个初学者的辛酸路程-继续Django

    问题1:HTTP请求过来会先到Django的那个地方? 先到urls.py  ,里面写的是对应关系,1个URL对应1个函数名. 如果发URL请求过来,到达这里,然后帮你去执行指定的函数,函数要做哪些事 ...

  8. 一个初学者的辛酸路程-初识Django

    前言: 主要是关于JavaScript的高级部分以及Django 主要内容: 一.jQuery 事件绑定: DOM事件绑定: -直接在标签上绑定 第一种: $('.title').click(func ...

  9. 一个初学者的辛酸路程-jQuery

    前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang=" ...

随机推荐

  1. IP:网际协议

    IP:网际协议 1.概述      IP是TCP/IP协议族中最为核心的协议.所有的TCP,UDP,ICMP,IGMP数据都以IP数据报格式传输.      IP提供不可靠,无连接的数据报传送服务. ...

  2. enode框架step by step之saga的思想与实现

    enode框架step by step之saga的思想与实现 enode框架系列step by step文章系列索引: 分享一个基于DDD以及事件驱动架构(EDA)的应用开发框架enode enode ...

  3. Cygwin 各种情况下中文乱码--终极解决方案

    0.引言 本人从进公司以来一直负责公司Android平台下产品的NDK开发,用的工具: 01. Google的adt-bundle(集成了eclipse和sdk) 02. NDK 03. Cygwin ...

  4. MS Sql Server 消除重复行 保留信息完整的一条 2011-11-26 13:19(QQ空间)

    select company ,count(company) as coun into myls from mylist group by company having count(company)& ...

  5. Run SPLAHS2 under SE mode on gem5在gem5的SE模式下,运行SPLASH2程序

    1.  安装相关的gem5,可以参考以前的博客. 2.  下载splash2编译好的软件 首先从gem5的官网下载已经编译成alpha指令集的splash2.下载地址:http://www.gem5. ...

  6. 开源中文分词工具探析(三):Ansj

    Ansj是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram + HMM分词模型(可参考我之前写的文章):在Bigram分词的基础上,识别未登录词,以提高 ...

  7. tampermonkey,采用js解析自定义脚本,实现网页列表数据采集分析

    最近一直在做数据采集的事情,目的是使用java开发一套分析指定采集规则,模拟用户动作做数据提取.因此定义了一套动作脚本,open,click,get,list,opentab,closetab...j ...

  8. azkaben任务调度器

    azkaban学习笔记总结 01.工作流调度器azkaban 1. 任务调度概述 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive ...

  9. Js-Html 前端系列--显示有格式的文本

    var dp = $("#dp").val(); var dpXSS = filterXss(dp); document.getElementById("descript ...

  10. error C2448 函数样式初始值设定项类似函数定义

    类似这种的 int grow_expansion(elen, e, b, h) int elen; REAL *e; REAL b; REAL *h; { // function definition ...