一个初学者的辛酸路程-FTP-9
前言
今天,我要描述一个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的更多相关文章
- 一个初学者的辛酸路程-python操作SQLAlchemy-13
前言 其实一开始写blog,我是拒绝的,但是,没办法,没有任何理由抗拒.今天呢,要说的就是如何使用Python来操作数据库. SQLAlchemy SQLAlchemy是Python编程语言下的一款O ...
- 一个初学者的辛酸路程-socket编程-8
前言: 你会发现会网络是多么幸福的事情 主要内容: socket 概念: socket本质上就是2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络通信都是基于 ...
- 一个初学者的辛酸路程-Python基础-3
前言 不要整天沉迷于学习-. 字典 一.我想跟你聊聊字典 1.为何要有字典? 大家有没有想过为什么要有字典?有列表不就可以了吗? 也许大家会这么认为,我给大家举个例子,大家就明白了. 比如说,我通讯录 ...
- 一个初学者的辛酸路程-了解Python-2
前言 blog花了一上午写的,结果笔记本关机了,没有保存,找不到了,找不到了啊,所以说,你看的每一篇blog可能都是我写了2次以上的--.哎!! 代码改变世界,继续......... Python基础 ...
- 一个初学者的辛酸路程-初识Python-1
前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 初识Python 一.它的爸爸是谁 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏 ...
- 一个初学者的辛酸路程-依旧Django
回顾: 1.Django的请求声明周期? 请求过来,先到URL,URL这里写了一大堆路由关系映射,如果匹配成功,执行对应的函数,或者执行类里面对应的方法,FBV和CBV,本质上返回的内容都是字符串 ...
- 一个初学者的辛酸路程-继续Django
问题1:HTTP请求过来会先到Django的那个地方? 先到urls.py ,里面写的是对应关系,1个URL对应1个函数名. 如果发URL请求过来,到达这里,然后帮你去执行指定的函数,函数要做哪些事 ...
- 一个初学者的辛酸路程-初识Django
前言: 主要是关于JavaScript的高级部分以及Django 主要内容: 一.jQuery 事件绑定: DOM事件绑定: -直接在标签上绑定 第一种: $('.title').click(func ...
- 一个初学者的辛酸路程-jQuery
前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang=" ...
随机推荐
- 学习OpenCV:滤镜系列(15)——羽化(模糊边缘)
============================================== 版权所有:小熊不去实验室CSDN博客 ================================== ...
- oracle表空间表分区详解及oracle表分区查询使用方法(转+整理)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- 如何成为一名hacker?
很多人问我如何成为黑客,一般来说我总是会扯一大堆废话,告诉他们要时刻保持好奇心,要学会打破规则挑战权威之类的. 但这类话肯定不是提问者想听的.我揣摩了一下他们的心情,他们想问的应该是这个问题:如何学习 ...
- UOJ#117. 欧拉回路
#117. 欧拉回路 题目描述 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 这张图是有向图.(5 ...
- Ubuntu14.04安装wineqq国际版出现无法输入中文的解决方法
执行命令:sudo vim /usr/bin/wine-qqintl 将"export LANG=zh_CN.utf8"改为"export LANG=en_US.utf8 ...
- delphi用TAdoStoredProc调用存储过程,兼容sql2005、2008、2014的远程事务问题
delphi7写的程序,在sql2000里没问题,调用sql2008.2014里的存储过程时,如果存储过程里操作了大量数据,很容易会莫名其妙的自己撤销掉,但是程序还识别不到,认为还在正常执行.今天尝试 ...
- svn问题(队列)
svn执行clean up命令时报错"Previous operation has not finished; run 'cleanup' if it was interrupted&quo ...
- 简单的HTML注册界面
<html><head><title>我的第一个HTML页面</title></head><body><center> ...
- linux的环境变量设置
source/etc/profile是让/etc/profile文件修改后立即生效, 还有一种方法是:. /etc/profile 注意:.和/etc/profile有空格 linux中source命 ...
- java 异常的捕获及处理
在没有异常处理的程序中如果要回避异常,需要使用大量的判断语句,配合所想到的错误状况来捕捉程序中可能发生的错误.但是这样势必会导致程序运行效率降低.java异常处理机制具有易于使用,可自定义异常类,处理 ...