Python tcp socket 传送文件

【测试环境】

os:Windows 10 x64
Python:3.6.3

【server.py】

#encoding: utf-8
#author: walker
#date:  2017-12-01 
#summary: 用socket创建tcp server以接收文件 

import os, time
import socket
import struct

cur_dir_fullpath = os.path.dirname(os.path.abspath(__file__))

Host = '127.0.0.1'
Port = 6789
BufSize = 8196
FmtHead = '256sHL'	#L决定单个文件必须小于4G
FmtHeadLen = struct.calcsize(FmtHead)
DstRoot = os.path.join(cur_dir_fullpath, 'output')	#目标目录
StartTime = time.time()		#开始时间	

def ProcAll():
		cnt = 0
		fileSizeTotal = 0
		sockServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		sockServer.bind((Host, Port))
		print('Listen prot %d ...' % Port)
		sockServer.listen(1)
		sock, addr = sockServer.accept()
		print('local: %s:%d' % (sock.getsockname()))
		print('client: %s:%d' % addr)
		while True:
			#接收数据包头(相对路径,相对路径长度,文件大小)
			pkgHead = sock.recv(FmtHeadLen)
			relPath, relPathLen, fileSize = struct.unpack(FmtHead, pkgHead)
			relPath = relPath.decode('utf8')[0:relPathLen]
			if relPath == 'OVER' and fileSize == 0:
				print('All file recv over!')
				break
			pathfile = os.path.join(DstRoot, relPath)
			dstDir = os.path.dirname(pathfile)
			if not os.path.exists(dstDir):
				os.makedirs(dstDir)
			with open(pathfile, mode='wb') as f:
				recvSize = 0	#单文件已接收数据量
				while True:
					if recvSize >= fileSize:
						break
					bufSize = BufSize
					if fileSize - recvSize < BufSize:	#剩余数据量小于BufSize
						bufSize = fileSize - recvSize
					buf = sock.recv(bufSize)
					f.write(buf)
					recvSize += len(buf)
				fileSizeTotal += recvSize
			cnt += 1
			print('cnt: %d, time cost: %.2fs, %s'% (cnt, time.time()-StartTime, pathfile))

		sock.close()
		sockServer.close()

		print('cnt: %d, time total: %.2fs, send bytes:%ld B'% (cnt, time.time()-StartTime, fileSizeTotal))

if __name__ == '__main__':
	ProcAll()

	print('Time total:%.2fs' % (time.time() - StartTime))

【client.py】

#encoding: utf-8
#author: walker
#date: 2017-12-01 
#summary: 用socket连接tcp server以传送文件

import os, time
import socket
import struct

cur_dir_fullpath = os.path.dirname(os.path.abspath(__file__))

Host = '127.0.0.1'
Port = 6789
BufSize = 8196
FmtHead = '256sHL'	#L决定单个文件必须小于4G
SrcRoot = os.path.join(cur_dir_fullpath, 'input')	#源目录
ExtSet = {'.pdf', '.html', '.htm'}		#后缀列表
StartTime = time.time()		#开始时间

def ProcAll():
	cnt = 0
	fileSizeTotal = 0
	sockClient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	print('Connect %s:%d ...' % (Host, Port))
	sockClient.connect((Host, Port))
	print('local: %s:%d' % (sockClient.getsockname()))
	for parent, dirnames, filenames in os.walk(SrcRoot):
		for filename in filenames:
			if os.path.splitext(filename)[1].lower() not in ExtSet:	#排除非指定后缀的文件
				continue
			pathfile = os.path.join(parent, filename)
			relPath = pathfile[len(SrcRoot):].strip(os.path.sep)	#相对路径(相对于SrcRoot)
			fileSize = os.path.getsize(pathfile)
			#发送数据包头(相对路径,相对路径长度,文件大小)
			pkgHead = struct.pack(FmtHead, relPath.encode('utf8'), len(relPath), fileSize)
			sockClient.sendall(pkgHead)
			with open(pathfile, mode='rb') as f:
				while True:
					buf = f.read(BufSize)
					if len(buf) < 1:
						break
					sockClient.sendall(buf)
			fileSizeTotal += fileSize
			cnt += 1
			print('cnt: %d, time cost: %.2fs, %s'% (cnt, time.time()-StartTime, pathfile))

	#发送文件传送结束消息
	pkgHead = struct.pack(FmtHead, 'OVER'.encode('utf8'), len('OVER'), 0)
	sockClient.sendall(pkgHead)

	sockClient.close()

	print('cnt: %d, time total: %.2fs, send bytes:%ld B'% (cnt, time.time()-StartTime, fileSizeTotal))

if __name__ == '__main__':
    
    
    ProcAll()
    
    print('Time total:%.2fs' % (time.time() - StartTime))

【相关阅读】

1、struct

2、socket

3、Socket Programming HOWTO

*** walker的流水账 ***

时间: 2024-10-06 15:00:11

Python tcp socket 传送文件的相关文章

Python Tcp Socket

socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型SOCKET_STREAM(TCP套接字),SOCKET_DGRAM(UDP套接字) TCP socket通信逻辑 TCP服务端:创建socket>>>绑定本地服务器>>>监听连接>>>通信交互>>>关闭连接 TCP客户端:创建socket

python tcp socket 多线程

不多说,直接上代码 client.py #!/usr/bin/python import socket,sys,string host="localhost" port=8000 def main(): sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.connect((host,port)) message = raw_input("please input whath you want to search

Linux C++ TCP Socket传输文件或图片实例

环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服务器端建立连接.连接建立成功后,读取文件内容(/root/workspace/socket-picture/bizhi.jpg),发送给服务器端,服务器端新建new1.jpg文件,将接收到的文件内容保存到new1.jpg中,new1.jpg在当前目录下: Server.cpp 1 #include<

Python TCP Socket 传输服务器资源信息(C/S)

服务器端脚本: 1 #!/usr/bin/env python 2 # coding:utf8 3 from socket import * 4 import os 5 import time 6 HOST='' 7 PORT=21567 8 BUFSIZ=1024 9 ADDR=(HOST,PORT) 10 11 tcpSerSock = socket(AF_INET,SOCK_STREAM) 12 tcpSerSock.bind(ADDR) #创建套接字 13 tcpSerSock.list

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys

[c#源码分享]客户端程序通过TCP通信传送&quot;小文件&quot;到服务器

源码  (不包含通信框架源码,通信框架源码请另行下载) 上一篇文章写了如何通过TCP通信发送图片到客户端,有朋友问如何传送文件,本文将就如何发送文件进行探讨. 对于比较小的文件,可以把文件转化成字节形式,用契约类包装一下,服务器收到后,再把字节转化成文件即可,这也是本文中实现的方式,这种方式的优点是比较简单灵活,缺点是不适合大文件的发送,也不能显示文件发送的进度. 基于TCP的通信机制,对于比较大的文件,这种方式是不可行的,大文件采用分段发送再合成的方式比较好,以后有时间再对如何发送大文件单独探

用Python多进程和paramiko给主机组批量分发命令和传送文件

需求: 1.用Python的多线程对主机组批量分发命令 2.需要有传送文件的功能 3.把输出的日志信息写到日志文件(包括正确输出日志,和错误输出日志,包含日志写入的时间) 准备工作: 1.把需要远程控制分发命令的机器(被控端)配置好ssh+key 2.下载第三方模块包 pycrypto-2.6.tar.gz   http://pan.baidu.com/s/1dFHSvcP paramiko-1.10.1.tar.gz http://pan.baidu.com/s/1hrWzg7y 在控制服务器

[python]初探socket

1.什么是socket? Socket中文译作:套接字,但是大家一般约定俗称的都用:socket.我想在解释socket是什么之前,先说它是用来干嘛的:socket是来建立'通信'的基础,建立连接,传输数据----'通信端点'. 我的理解:每个socket对象就是一个抽象的'通信对象',而'通信对象'做的事情就是发送或者接受信息.就想生活中:每个联网的计算机就是一个socket对象,每个打电话的人也是一个socket对象. 每个编程语言几乎都现成的socket类,为什么?你见过不能上网的计算机吗

python基础===socket模块的讲解(转)

一.网络知识的一些介绍 socket 是网络连接端点.例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web服务器主机,Web服务器也对来自的请求在一个socket上进行监听.两端使用各自的socket来发送和 接收信息. 在使用的时候,每个socket都被绑定到一个特定的IP地址和端口.IP地址是一个由4个数组成的序列,这4个数均是范围 0~255中的值(例如,220,176,36,76):端口数值的取