python3基于TCP实现CS架构文件传输


Posted in Python onJuly 28, 2018

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

1、目标:

基于tcp实现CS架构的文件传输

指令列表:(1)get:从服务器端下载文件

                    (2)put:向服务器端上传文件

                    (3)list:获得服务器端的目录

2、socket模块函数:

(1)send和sendall:send的作用是发送TCP数据,返回发送的数据大小。send函数不保证将所有数据全部发送,因此可能需要重复多次才能完成所有数据的发送。sendall的作用是发送完整的TCP数据,成功时返回None,失败时抛出异常

(2)bind:在服务器端使用,用于将socket绑定在一个特定的ip地址和端口上。在《UNIX网络编程》一书中提到,如果调用connect或者listen之前没有bind一个特定的端口,内核会为相应的套接字分配一个随机的端口。因此,在客户端调用connect函数之前不需要bind

(3)listen:通过参数设定服务器端最多可以接受几个客户端的连接,但是只有在完成与第一个客户端的传送后才会进行与第二个客户端的传送

3、代码:

(1)服务器端:

import socket 
import os 
import sys 
import time 
 
Host = '127.0.0.1' 
Port = 12000 
Addr = (Host, Port) 
 
sockListener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sockListener.bind(Addr) 
sockListener.listen(5) 
 
def recvfile(cliSocket): 
  print('start reveiving file...') 
  msg = 'no problem' 
  msg_utf8 = msg.encode(encoding="utf-8") 
  cliSocket.send(msg_utf8) 
  filename_utf8 = clientSocket.recv(4096) 
  filename = filename_utf8.decode() 
  f = open(filename, 'wb') 
  while True: 
    data_utf8 = cliSocket.recv(4096) 
    data = data_utf8.decode() 
    if data=='EOF': 
      print('received file successfully') 
      break 
    f.write(data_utf8) 
  f.close() 
 
def sendfile(cliSocket): 
  print('start sending file...') 
  msg = 'no problem' 
  msg_utf8 = msg.encode(encoding="utf-8") 
  cliSocket.send(msg_utf8) 
  filename_utf8 = cliSocket.recv(4096) 
  filename = filename_utf8.decode() 
  f = open(filename, 'rb') 
  while True: 
    data = f.read(4096) 
    if not data: 
      break 
    cliSocket.sendall(data) 
  f.close() 
  time.sleep(1) 
  msg = 'EOF' 
  msg_utf8 = msg.encode(encoding="utf-8") 
  cliSocket.sendall(msg_utf8) 
  print('sent file successfully') 
 
def getList(cliSocket): 
  path = sys.path[0] 
  every_file = os.listdir(path) 
  for filename in every_file: 
    pathmsg = filename + '\n' 
    pathmsg_utf8 = pathmsg.encode(encoding="utf-8") 
    cliSocket.sendall(pathmsg_utf8) 
  time.sleep(1) 
  msg = 'EOF' 
  msg_utf8 = msg.encode(encoding="utf-8") 
  cliSocket.sendall(msg_utf8) 
  print('all filenames have been send') 
 
while True: 
  print('waiting for connection...') 
  clientSocket, addr = sockListener.accept() 
  print('... connection from:', addr) 
 
  while True: 
    msg_utf8 = clientSocket.recv(4096) 
    msg = msg_utf8.decode() 
    if msg=='exit': 
      print(addr, 'close the connection') 
      break 
    elif msg=='get': 
      sendfile(clientSocket) 
    elif msg=='put': 
      recvfile(clientSocket) 
    elif msg=='list': 
      getList(clientSocket) 
    else: 
      print('client error!') 
      break

(2)客户端:

import socket 
import time 
 
Host = '127.0.0.1' 
Port = 12000 
Addr = (Host, Port) 
 
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
clientSocket.connect(Addr) 
 
def recvfile(filename): 
  print('start receiving file...') 
  f = open(filename, 'wb') 
  filename_utf8 = filename.encode(encoding="utf-8") 
  clientSocket.sendall(filename_utf8) 
  while True: 
    data_utf8 = clientSocket.recv(4096) 
    data=data_utf8.decode() 
    if data=='EOF': 
      print('receive file successfully') 
      break 
    f.write(data_utf8) 
  f.close() 
 
def sendfile(filename): 
  print('start sending file...') 
  f = open(filename, 'rb') 
  filename_utf8 = filename.encode(encoding="utf-8") 
  clientSocket.sendall(filename_utf8) 
  while True: 
    data = f.read(4096) 
    if not data: 
      break 
    clientSocket.sendall(data) 
  f.close() 
  time.sleep(1) 
  endmsg = 'EOF' 
  endmsg_utf8 = endmsg.encode(encoding="utf-8") 
  clientSocket.sendall(endmsg_utf8) 
  print('send file successfully') 
 
def confirm(confirm_command): 
  confirm_command_utf8 = confirm_command.encode(encoding="utf-8") 
  clientSocket.sendall(confirm_command_utf8) 
  msg_utf8 = clientSocket.recv(4096) 
  msg = msg_utf8.decode() 
  print('reveive message:', msg) 
  if msg=='no problem': 
    return True 
  else: 
    return False 
 
def operation1(filename): 
  if confirm('get'): 
    recvfile(filename) 
  else: 
    print('serve error!') 
 
def operation2(filename): 
  if confirm('put'): 
    sendfile(filename) 
  else: 
    print('serve error!') 
 
def operation3(act): 
  if act=='list': 
    act_utf8 = act.encode(encoding="utf-8") 
    clientSocket.sendall(act_utf8) 
    while True: 
      msg_utf8 = clientSocket.recv(1024) 
      msg = msg_utf8.decode() 
      if msg=='EOF': 
        break 
      print(msg) 
  else: 
    print('wrong command!') 
try: 
  while True: 
    command = input('>>>') 
    if not command: 
      continue 
    elif command=='exit': 
      command_utf8 = command.encode(encoding="utf-8") 
      clientSocket.sendall(command_utf8) 
      print('the connection is closed') 
      break 
    msg = command.split() 
    if len(msg)==2 and msg[0]=='get': 
      operation1(msg[1]) 
    elif len(msg)==2 and msg[0]=='put': 
      operation2(msg[1]) 
    elif len(msg)==1: 
      operation3(msg[0]) 
    else: 
      print('wrong command!') 
except socket.error as e: 
  print('error:', e) 
  print('an error causes the connection to close!') 
  clientSocket.close()

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

Python 相关文章推荐
Python中使用Inotify监控文件实例
Feb 14 Python
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
Python基于pygame实现的font游戏字体(附源码)
Nov 11 Python
利用Python实现命令行版的火车票查看器
Aug 05 Python
使用python为mysql实现restful接口
Jan 05 Python
解决Python 中英文混输格式对齐的问题
Jul 16 Python
python中使用zip函数出现错误的原因
Sep 28 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
PyTorch: Softmax多分类实战操作
Jul 07 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
python中str内置函数用法总结
Dec 27 Python
python cs架构实现简单文件传输
Mar 20 #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
You might like
PHP程序员编程注意事项
2008/04/10 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
微信小程序实现分页加载效果
2020/11/19 Javascript
python实现apahce网站日志分析示例
2014/04/02 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
python编程实现希尔排序
2017/04/13 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
深入浅析Python的类
2018/06/22 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
python super用法及原理详解
2020/01/20 Python
python的sys.path模块路径添加方式
2020/03/09 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
小学生学习感言
2014/03/10 职场文书
个人承诺书怎么写
2014/05/24 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
个人授权委托书样本
2014/09/13 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
留学推荐信英文范文
2015/03/26 职场文书
运动会1000米加油稿
2015/07/21 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书