侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   146

本文为大家分享了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三次握手建立连接:

当客户端调用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四次挥手断开连接:

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

服务端代码:

#!/usr/bin/env pythonfrom socket import *import timeimport sysimport os HOST = 'localhost'PORT = 9500BUFIZ = 1024ADDR = (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 pythonimport sysimport socketimport timeHOST = 'localhost'PORT = 9500BUFSIZ = 1024ADDR = (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.closedef 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:',efinally:  cliSockfd.close()

运行截图:

服务端:

客户端:

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

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


  • 上一条:
    python3基于TCP实现CS架构文件传输
    下一条:
    python版opencv摄像头人脸实时检测方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客