python cs架构实现简单文件传输


Posted in Python onMarch 20, 2020

本文为大家分享了python cs架构实现简单文件的传输代码,供大家参考,具体内容如下

要实现简单文件的传输我们必须考虑这些问题:

1.什么是c/s架构?

顾名思义,就是客户端端/服务器架构。不同的人可能回答不一,但是有一点是相同的:服务器是一个软件或硬件,用于向一个或多个客户端提供所需要的服务,服务器存在的唯一目的就是等待客户的请求,给这些客户服务,然后等待其他的请求。

2.客户端与服务端如何通信?

其实说白了就是互联网中两个主机该如何通信,首先我们用ip地址可以标示一台主机,这样就可以通信了么?当然也不行,我们还得标示主机中的进程,当然协议也是不可或缺的,是udp报文协议还是tcp数据流协议,这的看你个人的需求。用套介子来作为一个标示符,唯一标识网络进程。

想明白这两个问题我觉得这个问题有三分之一已经解决了,接下来呢我选择tcp协议来传输。

服务端:

        采用socket()函数 定义socket描述字

        bind()函数来把地址族中一个特定地址赋给socket,简单来说就是把一个ipv4/ipv6地址+端口号组合赋给socket

        listen()函数把socket变成被动类型的,等待客户连接请求。

        当客户端发来消息时用accept()函数来接受请求,同时给服务端返回客户端的socket描述字,接下来服务端以接收到的描述字来向客户端发送信息以及接受信息。

        我们这个程序是实现文件传输,我的想法是类似于ftp程序接受客户上传下载文件的需求。服务端启动后监听端口(我用的9500)等待客户连接。客户端三次握手建立连接后,客户输入命令来向客户端发起请求,输入‘ls'命令可以查看服务端可下载的文件,输入‘put   文件名',‘get  文件名'可以上传下载文件。上传文件时客户端打开本地文件以二进制方式读取文件内容并同时调用send()函数发送文件内容,服务端以写方式打开文件并将客户端上传内容写入文件,实现文件的上传。下载文件与此类似,客户端上传送‘get  文件名'命令同时以写方式打开文件 ,服务端收到命令以读方式打开文件,并发送给服务端。

tcp三次握手建立连接:

python cs架构实现简单文件传输

当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函 数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

tcp四次挥手断开连接:

python cs架构实现简单文件传输

某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;接收到这个FIN的源发送端TCP对它进行确认。

服务端代码:

#!/usr/bin/env python
from socket import *
import time
import sys
import os
 
HOST = 'localhost'
PORT = 9500
BUFIZ = 1024
ADDR = (HOST,PORT)
 
def recvfile(filename):
 print 'starting receive file...'
 f = open(filename,'wb')
 cliSockfd.send('no problem')
 while True:
  data = cliSockfd.recv(4096)
  if data == 'EOF':
   print 'recved file success!'
   break
  f.write(data)
 f.close()
 
def sendfile(filename):
 print 'starting send file...'
 cliSockfd.send('no problem')
 f = open(filename,'rb')
 while True:
  data = f.read(4096)
  if not data:
   break
  cliSockfd.send(data)
 f.close()
 time.sleep(1)
 cliSockfd.send('EOF')
 print 'send file success!'
def handle1(act,filename):
 if act == 'put':
  print 'recving msg!'
  recvfile(filename)
 elif act == 'get':
  print 'sending msg!'
  sendfile(filename)
 else:
  print 'error!'
 
def handle2(act):
 if act == 'ls':
  path = sys.path[0]
  every_file = os.listdir(path)
  for filename in every_file: 
   cliSockfd.send(filename + ' ')
  time.sleep(1)
  cliSockfd.send('EOF')
  print 'all filename has send to client success!'
 else:
  print 'command error'
 
sockfd = socket(AF_INET,SOCK_STREAM)
sockfd.bind(ADDR)
sockfd.listen(5)
while True:
 print 'waiting for connection...'
 cliSockfd,addr = sockfd.accept()
 print '...connected from:',addr
 
 while True:
  msg = cliSockfd.recv(4096)
  if msg == 'close':
   print 'client closed'
   break
  info = msg.split()
  if len(info) == 2:
   handle1(*info)
  elif len(info) == 1:
   handle2(*info)
  else:
   print 'command error!'
   break

客户端代码:

#!/usr/bin/env python
import sys
import socket
import time
HOST = 'localhost'
PORT = 9500
BUFSIZ = 1024
ADDR = (HOST,PORT)
 
cliSockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 
def recvfile(filename):
 f = open(filename,'wb')
 while True:
  msg = cliSockfd.recv(4096)
  if msg == 'EOF':
   print 'recv file success!'
   break
  f.write(msg)
 f.close
def sendfile(filename):
 f = open(filename,'rb')
 while True:
  msg = f.read(4096)
  if not msg:
    break
  cliSockfd.sendall(msg)
 f.close()
 time.sleep(1)
 cliSockfd.sendall('EOF')
 print 'send file success'
def confirm(cliSockfd,client_command):
 cliSockfd.send(client_command)
 msg = cliSockfd.recv(4096)
 if msg == 'no problem':
  return True
 
def handle1(act,filename):
 if act == 'put':
  if confirm(cliSockfd,client_command):
   sendfile(filename)
  else:
   print 'server error1!'
 elif act == 'get':
  if confirm(cliSockfd,client_command):
   recvfile(filename)
  else:
   print 'server error2!'
 else:
  print 'command error!'
def handle2(act):
 if act == 'ls':
  cliSockfd.send('ls')
  while True:
   msg = cliSockfd.recv(1024)
   if msg == 'EOF':
    break
   print msg
 else:
  print 'command error'
 
try:
 cliSockfd.connect(ADDR)
 print 'connect to ',ADDR
 while True:
  client_command = raw_input('>>>')
  if not client_command:
   continue
  msg = client_command.split()
  if len(msg) == 2:
   handle1(*msg)
  elif len(msg) == 1 and msg != ['close']:
   handle2(*msg)
  elif len(msg) == 1 and msg == ['close']:
   cliSockfd.send('close')
   break
  else:
   print 'command error'
except socket.error,e:
 print 'error:',e
finally:
 cliSockfd.close()

运行截图:

服务端:

python cs架构实现简单文件传输

客户端:

python cs架构实现简单文件传输

欢迎各位大牛,多提宝贵意见。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用ConfigParser解析ini配置文件实例
Aug 30 Python
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
在Python的Django框架中编写编译函数
Jul 20 Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 Python
Python数据拟合与广义线性回归算法学习
Dec 22 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
Jul 04 Python
python 并发下载器实现方法示例
Nov 22 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
python中pow函数用法及功能说明
Dec 04 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
Tornado Web Server框架编写简易Python服务器
Jul 28 #Python
python使用tornado实现登录和登出
Jul 28 #Python
基于python实现简单日历
Jul 28 #Python
python使用tcp实现局域网内文件传输
Mar 20 #Python
基于python3实现socket文件传输和校验
Jul 28 #Python
python多进程实现文件下载传输功能
Jul 28 #Python
python如何生成网页验证码
Jul 28 #Python
You might like
收音机术语解释
2021/03/01 无线电
谈谈新手如何学习PHP 默默经典版本
2009/08/04 PHP
PHP 批量删除数据的方法分析
2009/10/30 PHP
php之curl设置超时实例
2014/11/03 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
js身份证验证超强脚本
2008/10/26 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
jQuery旋转插件jqueryrotate用法详解
2016/10/13 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
JS实现简易计算器
2020/02/14 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
Python用input输入列表的实例代码
2020/02/07 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
《三峡》教学反思
2014/03/01 职场文书
报告会主持词
2014/04/02 职场文书
大一新生学期自我评价
2014/04/09 职场文书
品牌转让协议书
2014/08/20 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书