您的位置:首页 > 理论基础 > 计算机网络

python使用tcp socket 传输文件-服务端,客户端

2017-12-21 21:27 716 查看
1.文件接收-服务端

#_*_coding:utf-8_*_
# !/etc/bin/env python2.7
#coded by wangjd@2017
#socket file server
import socket
import SocketServer
import struct
import os
#导入外部插件
#定义服务器,地址,端口
address=("",9999)
#(ip,port)
class MyRequestHandler(SocketServer.BaseRequestHandler):
#继承SocketServer请求处理的类
def handle(self):
#重写handle方法
print("connect from :",self.client_address)
# 打印客户端连接的IP
while True:
#没有报错执行
fileinfo_size=struct.calcsize('128sl')
#定义文件信息,文件名为128bytes长度
self.buf=self.request.recv(fileinfo_size)
#接受的是客户端发送过来的头部信息
if self.buf:
self.filename,self.filesize=struct.unpack('128sl',self.buf)
#解包得到文件名和文件大小
print("filename and size:",self.filename,self.filesize)
self.filename=os.path.join('/home/wangjd/Desktop/','new'+self.filename.strip('\00'))
#重新处理文件名,使用trip删除打包时候的多余空字符
recvd_size=0
#初始化接受了的文件大小
file=open(self.filename,'wb')
#打开文件
print("start recv data..")
while not recvd_size==self.filesize:
#当没接收完时候执行
if self.filesize -recvd_size > 1024:
rdata=self.request.recv(1024)
recvd_size+=len(rdata)
#叠加大小
else:
rdata=self.request.recv(self.filesize-recvd_size)
recvd_size=self.filesize
file.write(rdata)
#写入
file.close()
#关闭文件
SocketServer
print('data.....finish')
if __name__ == '__main__':
tcpSever=SocketServer.ThreadingTCPServer(address,MyRequestHandler)
print('waiting...')
tcpSever.serve_forever()
#保持


2.文件发送-客户端

#_*_coding:utf-8_*_
# !/etc/bin/env python2.7
#coded by wangjd@2017
#file clients
import socket
import time
import struct
import os
#导入外部插件
#定义客户端,地址
sc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#实例化socket
address=('127.0.0.1',9999)
#定义address
sc.connect(address)
#发起连接
while True:
file_path="/home/wangjd/Desktop/test.txt"
#定义要传输的文件地址
file_info_size=struct.calcsize('128sl')
#定义打包规则
fhead=struct.pack('128sl',os.path.basename(file_path),os.stat(file_path).st_size)
#定义头信息
sc.send(fhead)
#首先发送头部信息
print("send file:",file_path)
#打印文件信息
if True:
#一切正常,开始处理文件
fo=open(file_path, 'rb')
fileData=fo.read(1024)
#读取文件数据,1024切分
if not fileData:
break
#文件为空break
else:
sc.send(fileData)
#发送数据,1024切分的数据
fo.close()
#发送结束,关闭文件。
print("finish send..")
sc.close()
exit()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: