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实现DNS正向查询、反向查询的例子
Apr 25 Python
Python装饰器使用示例及实际应用例子
Mar 06 Python
Python打印scrapy蜘蛛抓取树结构的方法
Apr 08 Python
Django框架下在视图中使用模版的方法
Jul 16 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
Python去除字符串前后空格的几种方法
Mar 04 Python
Python2.7实现多进程下开发多线程示例
May 31 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 Python
python关于调用函数外的变量实例
Dec 26 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
使用Keras画神经网络准确性图教程
Jun 15 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
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
js工具方法弹出蒙版
2013/05/08 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
编写Python的web框架中的Model的教程
2015/04/29 Python
python字符串,数值计算
2016/10/05 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
Linux面试题LINUX系统类
2014/11/19 面试题
市优秀教师事迹材料
2014/02/05 职场文书
公司副总经理任命书
2014/06/05 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
春节慰问信范文
2015/02/15 职场文书