使用socket实现的ftp文件传输服务器
服务端:
# encoding:utf-8
# Author:"richie"
# Date:8/23/2017 from socket import *
import pickle
import os server=('127.0.0.1',17001)
root_path= os.path.abspath(os.curdir) # The absolute path of the current folder
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(server)
sock.listen(5)
print('Wait for the client connection!!!')
while True: # Link cycle
conn, addr = sock.accept() #Waiting for client connection
print('Connect by',addr)
while True: # Communication cycle
try:
data = conn.recv(1024) # Receive client data
if not data: break
filename = data.decode('utf-8') # Bytes -> String
file_path = os.path.join(root_path,filename) # join path
# get file size if file not existed file size is zero
file_size = os.path.getsize(file_path) if os.path.exists(file_path) else 0
header = pickle.pack('q', file_size) # pack header
conn.send(header) # send header
if file_size: #The file exists and size than 0
with open(file_path,'rb') as f:
for line in f:
conn.send(line) # send line of file data
else:
conn.send(b'')
except ConnectionResetError as e: # conn abnormal
break
except Exception as e:
print(e)
conn.close()
客户端
# encoding:utf-8
# Author:"richie"
# Date:8/23/2017 from socket import *
import pickle,sys
import os
def progress(percent,width=250):
if percent >= 100:
percent=100
show_str=('[%%-%ds]' %width) %(int(width * percent / 100) * "#") #字符串拼接的嵌套使用
print("\r%s %d%%" %(show_str, percent),end='',file=sys.stdout,flush=True) server=('127.0.0.1',17001)
sock = socket(AF_INET,SOCK_STREAM)
sock.connect(server)
root_path= os.path.abspath(os.curdir) # The absolute path of the current folder while True:
print('The current home path is '+root_path)
filename = input('Please enter the path>>:').strip()
if not filename:continue
sock.send(filename.encode('utf-8'))
header = sock.recv(8) # Receive the header
total_size = pickle.unpack('q',header)[0] # get header data
each_recv_size = 1024*8421
recv_size = 0
recv_data = b''
down_filename = 'down_'+filename
f = open(down_filename,'wb')
while recv_size < total_size:
if total_size - recv_size < each_recv_size:
data = sock.recv(total_size - recv_size)
else:
data = sock.recv(each_recv_size)
recv_size += len(data)
recv_percent = int(100 * (recv_size / total_size)) # Receive the percent
progress(recv_percent, width=30) # The width of the progress bar is 30
f.write(data)
print()
f.close()
使用socket实现的ftp文件传输服务器的更多相关文章
- FTP文件传输服务器原理
FTP服务器,全称File Transfer Protocol Server,是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务.FTP,文件传输协议(File Transfer ...
- vsftpd-基于ftp协议的文件传输服务器软件
第一部分:在Linux上部署vsftpd服务 1. vsftpd简介 1.1 vsftpd是什么? ftp(File Transfer Protocol)文件传输协议.(实现不同操作系统之间文件的传输 ...
- Python实现终端FTP文件传输
实现终端FTP文件传输 代码结构: .├── client.py├── readme.txt└── server.py 运行截图: readme.txt tftp文件服务器 项目功能: * 客户端有简 ...
- 【RL-TCPnet网络教程】第35章 FTP文件传输协议基础知识
第35章 FTP文件传输协议基础知识 本章节为大家讲解FTP(File Transfer Protocol,文件传输协议)的基础知识,方便后面章节的实战操作. (本章的知识点主要整理自网络) ...
- FTP文件传输服务
FTP文件传输服务 一 .FTP 连接及传输的模式 l 控制连接:TCP21,用于发送FTP命令信息. l 数据连接:TCP 20, 用于上传下载数据. · 数据连接建立的类型: ·主动模式: 服 ...
- SSIS 学习之旅 FTP文件传输-脚本任务
这一章主要讲解一下用脚本怎么把CSV文件抛送到FTP服务器上 设计: 通过Demon库的Users表数据生成CSV文件. 生成后的CSV文件抛送到FTP指定目录下. 控件的使用这里就不做详细讲 ...
- FTP 文件传输服务
昨晚心血来潮,尝试用python写了一个ftp文件传输服务,可以接收指令,从远程ftp服务器同步指定目录数据,最后没用上,开源出来. https://github.com/jadepeng/ftp_t ...
- FTP(文件传输协议)工作原理
目前在网络上,如果你想把文件和其他人共享.最方便的办法莫过于将文件放FTP服务器上,然后其他人通过FTP客户端程序来下载所需要的文件. 1.FTP架构 如同其他的很多通讯协议,FTP通讯协议也采用客户 ...
- Windows下通过socket进行字符串和文件传输
今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...
随机推荐
- 关于chrome浏览器的帐号密码和背景色的填充问题
不知道大家平时做项目的时候有木有关注这个问题,其实之前做项目遇到过类似的问题,但是因为是单独的chrome浏览器的填充,而且是样式问题稍微严重点,也就没在意.然而在近期的项目中有遇到了这个问题,最为一 ...
- mybatis关联
title: mybatis关联 date: 2017-12-18 18:00:30 tags: - [mybatis] categories: - [编程] - [开发工具] permalink: ...
- Linux Centos安装及卸载Apache
一.卸载 1.查看有没有安装apache,出现下面信息则安装过 [root@localhost ~]# rpm -qa|grep httpd httpd-2.2.15-53.el6.centos.x8 ...
- 《C++程序设计语言(十周年纪念版)》【PDF】下载
<C++程序设计语言(十周年纪念版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382171 内容简介 <C++程序设计 ...
- Hibernate--使用xml配置映射关系
写在前面: 配置实体类与数据库的映射关系,有两种方式: 1.使用*.hbm.xml 2.使用@注解 二:xml的配置方式: eg:员工的xml配置文件: <?xml version=" ...
- iOS 字体设置,字体类型展示
字体设置: [UIFont fontWithName:@"Helvetica" size:17.0]]; 字体名字,如图 UIFont fontWithName 后不知道字体的名字 ...
- Jenkins 关闭和重启实现方式.
1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/,那么我只需要在浏览器地址栏上敲下http ...
- MySQL in or效率对比
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/60 考虑如下两个sql: select * from table ...
- Find all factorial numbers less than or equal to N
A number N is called a factorial number if it is the factorial of a positive integer. For example, t ...
- bzoj 4012: [HNOI2015]开店 主席树
Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...