一个初学者的辛酸路程-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=" ...
随机推荐
- BCP导入导出MsSql
BCP导入导出MsSql 1.导出数据 (1).在Sql Server Management Studio中: --导出数据到tset1.txt,并指定本地数据库的用户名和密码 --这里需要指定数据库 ...
- Nhibernate1
Nhibernate随手记(1) 学习Nhibernate的萌芽 今早有群里有人问Nhibernate的问题,没学过,刚好来了兴趣,无意很快在园子里下载到了一本Nhibernate3.0的电子书,内容 ...
- C++中内存泄漏的检测方法介绍
C++中内存泄漏的检测方法介绍 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck, ...
- create OpenVPN on ubuntu12.04
---恢复内容开始--- 最近比较火的有digitalocean 的SSD VPS,配置还不错.每个月5刀,512MB内存,CPU被虚拟过.不是KVM.链接能量也不大. 节点在西雅图,对环太平洋比较 ...
- ZOJ 3529 A Game Between Alice and Bob 博弈好题
A Game Between Alice and Bob Time Limit: 5 Seconds Memory Limit: 262144 KB Alice and Bob play t ...
- yum局域网软件源搭建
之前的Demo算是告一段落了,期末的各种考试报告也结束了. 暑假的一项任务就是和其他几个同学一起,在若干台服务器上安装openstack,虚拟出更多的机器,对各种分布式/并行数据分析平台进行测试. 目 ...
- nginx反射理传apache配置 - cookie去哪儿了?
在公司接手了个微信项目,由于微信环境下访问网站需要使用对外开放的域名,所以有相关问题,都是直接运维同事帮忙处理. 原理是这样: 方案一: 1. 将域名解析指向测试服务器的地址: 2. 开放相关端口访问 ...
- 在Node.js中使用RabbitMQ系列一 Hello world
在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队列的实现方案.本篇文章以Node.js为例子,来实际操作如何和RabbitMQ进行交互. 介绍 Rabbi ...
- Ionic的项目结构-工程目录
做前端的都应该知道一个框架 Ionic 这个是移动端webAPP最好用的吧(个人认为),那今天就来说说这个项目的结构以及文件的含义,希望对大家有所帮助 想看如何生成文件的话详细看我上篇博客 在用编 ...
- SpringMVC第一天(其他)
SpringMVC第一天 框架课程 课程计划 参数绑定 SpringMVC默认支持的类型 简单数据类型 Pojo类型 Pojo包装类型 自定义参数绑定 SpringMVC和Struts2的区别 高级参 ...