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的web框架中中编写日志列表的教程
Apr 30 Python
详解python 字符串和日期之间转换 StringAndDate
May 04 Python
老生常谈python的私有公有属性(必看篇)
Jun 09 Python
对numpy中轴与维度的理解
Apr 18 Python
python文件拆分与重组实例
Dec 10 Python
利用pyinstaller打包exe文件的基本教程
May 02 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
浅谈PyTorch中in-place operation的含义
Jun 27 Python
解决pytorch 模型复制的一些问题
Mar 03 Python
python实现web邮箱扫描的示例(附源码)
Mar 30 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
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
php实现的简单日志写入函数
2015/03/31 PHP
php将html转为图片的实现方法
2017/05/19 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
基于jquery循环map功能的代码
2011/02/26 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
js编写选项卡效果
2017/05/23 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
2020/05/20 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
python实现梯度下降法
2020/03/24 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
高三政治教学反思
2014/02/06 职场文书
应届生求职信
2014/05/31 职场文书
个人安全生产责任书
2014/07/28 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
五四青年节活动总结
2015/02/10 职场文书
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL