使用python socket分发大文件的实现方法

思路:

使用socket传输文件过程中,如果单次传输每次只能发送一部分数据,如果针对大文件,一次传输肯定是不行的,所以需要我们在传输的时候提前把传输内容的大小先发送给客户端,在客户端循环接收数据即可。

代码部分:

一、服务器

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#environment:2.7

import os,json,time,socket
sk = socket.socket()
ip_port=('127.0.0.1',9600)
sk.bind(ip_port)
sk.listen(5)
file_path = '/root/update/123.txt'
file_name = file_path.rsplit(os.sep,1)[1]
file_size = os.path.getsize(file_path)  #获取文件内容大小
#发送给客户端的头部信息
header_data = {
  'file_name': file_name,
  'file_size': file_size,
  'date': time.strftime('%Y-%m-%d %X',time.localtime()),
  'charset': 'utf-8'
}
while True:
  conn, addr = sk.accept()
  print("%s:%s is connect"% addr)
  request_data = conn.recv(1024)
  print(request_data)
  # 把头部内容发送过去
  conn.send(json.dumps(header_data))
  request_data1 = conn.recv(1024)
  print(request_data1)
  f = open(file_path,'r')
  content = f.read()
  #发送文件内容
  conn.sendall(content)
  conn.close()

二、客户端

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#environment:2.7

import socket,json
while True:
  sk = socket.socket()
  ip_port = ('127.0.0.1',9600)
  sk.connect(ip_port)
  user_input = raw_input('>>>:').strip()
  if len(user_input) == 0:continue
  if user_input == 'q':break
  sk.send(user_input)
  server_head_msg = json.loads(sk.recv(1024))
  print(server_head_msg)
  #文件名res_name,文件大小res_size
  res_name = server_head_msg['file_name']
  res_size = server_head_msg['file_size']
  sk.send('已经收到头部信息,你可以发送数据了')
  #下面是循环接收文件内容的部分
  num = res_size/1024.0
  if num != int(num):
    num = int(num) +1
  else:
    num = int(num)
  for i in range(num):
    content = sk.recv(1024)
    print(content)

备注:在接收服务器端发送来的文件也按照判断每次接收数据的大小来考虑,大致思路如下

res = ''
recive_size = 0
while recive_size <= res_size:
  data = sk.recv(1024)
  recive_size += len(data)
  res += data
else:
  print(res)
  print('done'.center(40,'='))

以上这篇使用python socket分发大文件的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python3利用Socket实现通信的方法示例

    参考于: python cs架构实现简单文件传输 原文中程序运行有误,在此做修改与解释,如下: 功能说明: 共2个py文件分别为server和client端,采用socket进行通信.提供两种功能:"dir" 命令用于显示服务器端可下载文件名:"get/put+文件名" 命令用于与服务器端进行下载或发送数据交换. Socket解释 服务器上socket编写步骤: 1.调用socket函数创建socket对象,如: socket_server = socket.soc

  • python 通过 socket 发送文件的实例代码

    目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = r'D:\Python\python_learning\gd\code\part3\02网络编程\文件传输\client\download' gd_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) gd_client.connect((

  • python:socket传输大文件示例

    文件可以传输,但是对比传输前后的文件:socket_test.txt,末尾有一些不一致服务端代码: #!/usr/bin/python # -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding("utf-8") import time ''' 等待连接 等待发送文件 读取数据 写入文件并且保存 等待连接 ''' import socket import threading import time impo

  • Python按行读取文件的实现方法【小文件和大文件读取】

    本文实例讲述了Python按行读取文件的实现方法.分享给大家供大家参考,具体如下: 小文件: #coding=utf-8 #author: walker #date: 2013-12-30 #function: 按行读取小文件 all_lines = [] try: file = open('txt.txt', 'r') all_lines = file.readlines() except IOError as err: print('File error: ' + str(err)) fin

  • 基于python3实现socket文件传输和校验

    基于socket的文件传输并进行MD5值校验,供大家参考,具体内容如下 文件传输分为两个类,一个是服务端,一个是客户端. 客户端发起发送文件或接收文件的请求,服务端收到请求后接收或发送文件,最后进行MD5值的校验 socket数据通过struct模块打包 需要发送文件到服务端时,调用sendFile函数,struct包内包含文件信息.文件大小.文件MD5等信息,服务端接收到文件后进行MD5值校验,校验成功后则返回成功 需要从服务器下载文件时,调用recvFile函数,收到文件后进行MD5校验 c

  • 使用python socket分发大文件的实现方法

    思路: 使用socket传输文件过程中,如果单次传输每次只能发送一部分数据,如果针对大文件,一次传输肯定是不行的,所以需要我们在传输的时候提前把传输内容的大小先发送给客户端,在客户端循环接收数据即可. 代码部分: 一.服务器 #!/usr/bin/env python #-*- coding:utf-8 -*- #environment:2.7 import os,json,time,socket sk = socket.socket() ip_port=('127.0.0.1',9600) s

  • golang socket断点续传大文件的实现方法

    在日常编程中,我们肯定会遇到用socket传送文件内容,如果是大文件的,总不能传送到一半因某原因断掉了,又从新传送文件内容吧.对,我们需要续传,也就是接着上次传送的位置继续发送文件内容. 续传的话,其实并不难,我理解的思路大概如下: 客户端发送消息询问服务端,你上次接收到的文件内容位置 服务端告诉客户端上次接收到的文件内容位置 客户端就从上次断点的位置继续发送文件内容 客户端发送文件内容完毕后通知服务端,然后断开连接 下面我们看看代码的实现 服务端 // file name: server.go

  • Python实现将一个大文件按段落分隔为多个小文件的简单操作方法

    本文实例讲述了Python实现将一个大文件按段落分隔为多个小文件的简单操作方法.分享给大家供大家参考,具体如下: 今天帮同学处理一点语料.语料文件有点大,并且是以连续两个换行符作为段落标志,他想把它按段落分隔成多个小文件,即每3个段落组成一个新文件.由于以前没有遇到过类似的操作,在网上找了一些相似的方法,看起来都有点复杂.所以经尝试,自己写了一段代码,完美解决问题. 基本思路是,先读原文件内容,并使用正则表达式,依据\n\n进行切片处理,结果为一个列表,其中每一个列表元素都存放一个切片中的内容;

  • python简单读取大文件的方法

    本文实例讲述了python简单读取大文件的方法.分享给大家供大家参考,具体如下: Python读取大文件(GB级别)采用的办法很简单: with open(...) as f: for line in f: <do something with line> 例如: with open(filepath,'r') as infile: for line in infile: print line 一切都交给python解释器处理,读取效率很高,且占用资源少. stackoverflow参考链接:

  • Python实现大文件排序的方法

    本文实例讲述了Python实现大文件排序的方法.分享给大家供大家参考.具体实现方法如下: import gzip import os from multiprocessing import Process, Queue, Pipe, current_process, freeze_support from datetime import datetime def sort_worker(input,output): while True: lines = input.get().splitlin

  • python实现读取大文件并逐行写入另外一个文件

    <pre name="code" class="python">creazy.txt文件有4G,逐行读取其内容并写入monday.txt文件里. def creazyRead(): ''''' with open("e:creazy.txt","r") as cr: for line in cr: print line ''' ms = open("e:creazy.txt") for line

  • python 多线程将大文件分开下载后在合并的实例

    废话不多说了,上代码吧: import threading import requests import time import os class Mythread(threading.Thread): def __init__(self,url,startpos,endpos,f): super(Mythread,self).__init__() self.url=url self.startpos=startpos self.endpos=endpos self.fd=f def downl

  • 使用python进行拆分大文件的方法

    python按指定行数把大文件进行拆分 如图大文件有7000多万行,大小为16G 需要拆分成多个200万行的小文件 代码如下: # -*- coding:utf-8 -*- from datetime import datetime def Main(): source_dir = '/data/u_lx_data/zhangqm/sh/yanjie/liuxuesheng/jz_yuanshi_list0206.txt' target_dir = '/data/u_lx_data/zhangq

  • Python高效处理大文件的方法详解

    目录 开始 处理文本 串行处理 多进程处理 并行处理 并行批量处理 将文件分割成批 运行并行批处理 tqdm 并发 结论 为了进行并行处理,我们将任务划分为子单元.它增加了程序处理的作业数量,减少了整体处理时间. 例如,如果你正在处理一个大的CSV文件,你想修改一个单列.我们将把数据以数组的形式输入函数,它将根据可用的进程数量,一次并行处理多个值.这些进程是基于你的处理器内核的数量. 在这篇文章中,我们将学习如何使用multiprocessing.joblib和tqdm Python包减少大文件

随机推荐