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中文件I/O高效操作处理的技巧分享
Feb 04 Python
python利用Guetzli批量压缩图片
Mar 23 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
python 获取图片分辨率的方法
Jan 08 Python
python实现移位加密和解密
Mar 22 Python
Python匿名函数及应用示例
Apr 09 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
python实现静态web服务器
Sep 03 Python
基于python实现把图片转换成素描
Nov 13 Python
Python实现http接口自动化测试的示例代码
Oct 09 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 Python
使用Django实现商城验证码模块的方法
Jun 01 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
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
浅谈js原生拖放
2016/11/21 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
python中的闭包函数
2018/02/09 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
优秀党员主要事迹
2014/01/19 职场文书
决心书标准格式
2014/03/11 职场文书
创文明城市标语
2014/06/16 职场文书
2014年村官工作总结
2014/11/24 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
六年级数学教学反思
2016/02/16 职场文书
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL