前言

今天,我要描述一个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. spring实现数据库读写分离

    现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应 ...

  2. 一步一步深入spring(1)--搭建和测试spring的开发环境

    1.引用jar包 到spring的网站上下载spring的jar包(本文是2.5.6),解压缩后找到 使用spring必须引用的jar包 spring.jar  commons-logging.jar ...

  3. openbr on linuxmint13/ubuntu12.04/debian7 x64 facial recognition [Compile from source!!!]

    Openbr is a great project for facial detecting. System: linuxmint 13 x86_64 Face recognition,  motio ...

  4. yum局域网软件源搭建

    之前的Demo算是告一段落了,期末的各种考试报告也结束了. 暑假的一项任务就是和其他几个同学一起,在若干台服务器上安装openstack,虚拟出更多的机器,对各种分布式/并行数据分析平台进行测试. 目 ...

  5. 关于C/C++中的“auto”

    C/C++ 98标准 C++03标准 意思完全一样:auto被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存.auto的出现意味着,当前变量的作用域为当前函数或代码段的局部变量,意味着当 ...

  6. js操作

    1.1.直接传入Javascript代码,定位元素 js可以点击页面上不显示暂时隐藏(比如下拉列表),但是html文件中存在的属性 WebDriver driver = new FirefoxDriv ...

  7. 创建maven多模块项目(idea工具)

    1.创建父项目模块(new 一个maven空项目模块)不勾选 create from archetype  删除src目录 2.创建子模块 webapp (该模块为web入口模块) 3.创建其他子模块 ...

  8. selenium2使用记录

    安装 pip install selenium web phantomjs下载 :http://phantomjs.org/download.html 浏览器驱动下载:http://www.selen ...

  9. Reprint: Serialization

    Having just recently ran into some major serialization issues I’m going to list some of the errors a ...

  10. Oracle与Sqlserver:Order by NULL值介绍

    针对页面传参到in的子集中去进行查询操作的话,就会有in(xxx,null),这样就会导致查询的结果中其实直接过滤掉了null,根本就查不出来null的值.之前对于null的操作都是进行不同数据库的n ...