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生成指定尺寸缩略图的示例
May 07 Python
Python文件夹与文件的操作实现代码
Jul 13 Python
python分析nignx访问日志脚本分享
Feb 26 Python
python访问系统环境变量的方法
Apr 29 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 Python
Python常用库推荐
Dec 04 Python
python中实现k-means聚类算法详解
Nov 11 Python
python机器学习实战之最近邻kNN分类器
Dec 20 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
解决Python内层for循环如何break出外层的循环的问题
Jun 24 Python
Python shelve模块实现解析
Aug 28 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
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
js 图片等比例缩放代码
2010/05/13 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
Vue computed 计算属性代码实例
2020/04/22 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python字符串详细介绍
2015/05/09 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
Python中django学习心得
2017/12/06 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
django使用admin站点上传图片的实例
2019/07/28 Python
村官学习十八大感想
2014/01/15 职场文书
公务员转正考察材料
2014/02/07 职场文书
1亿有多大教学反思
2014/05/01 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
焦裕禄观后感
2015/06/03 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书