前言

今天,我要描述一个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. SVN Access to '/svn/Test/!svn/me' forbidden,不能更新解决办法

    从之前的电脑将Repositorise复制到现在用的PC,出现可以checkout但是不能update的问题.在网上找到以下解决方法,均未能解决. 1.确认URL跟实际一致: 2.确认用户名密码正确: ...

  2. Java网络请求getInputStream异常

    今天调试网络请求部分时,当getInputStream失败时直接抛出异常.解决方法时在getInputStream之前获取ResponseCode if( connection.getResponse ...

  3. Linux centOS本地DNS安装

    centOS本地DNS安装 在centOS里最常用的DNS服务工具应该是bind了.下面就以bind为例做一个DNS服务. 首先查看bind 是否已经安装 Rpm -qa | gerp bind 如果 ...

  4. 安全验证之使用摘要认证(digest authentication)

    安全验证之使用摘要认证(digest authentication) 在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看 ...

  5. LAMP on ubuntu12.04 PHP, Apache2, MySQL, Linux ( with phpmyadmin installed)

    there are several procedure which include: 1. Install the packages sudo apt-get install php5 php5-gd ...

  6. zoj1537- Playing with a Calculator

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=537 题意:给你一个k值,现在要你求一个最小的N 值,N每一个数位上的数值a均相 ...

  7. json文件报expected name at 1 1错误

    在eclipse编辑json文件时出现expected name at 1 1错误,解决方式如下: 方法一:json文件是不支持注释的,把所有/* content */删除即可 如果不想删除注释-- ...

  8. 关于js关闭浏览器技术细谈

    前言:前端时间做项目遇到一个js的问题,需要使用js关闭浏览器,在原有js代码是有这样功能的, 代码如下 window.close(); 但是呢,chrome,firefox等中有时候会不起作用. 后 ...

  9. .NET基础——运算符

    这一篇我们来讲解C#中的运算符 1. C#中的算术运算符 5个算数运算符:+  -  *  /  %     它们都是二元运算符,*  /  % 的运算优先级相同,并且高于 +  - ,+  - 的运 ...

  10. C语言之while和do-while

    一 while和do-while的简介 1). while语句 语法: while(表达式){ 循环体; } 循环过程: 1.先判断表达式,是否为真,如果为真跳转到2,否则跳转到3 2.执行循环体,执 ...