python_day26__02__文件的传送

#Author:'haijing'
#date:2018/11/14

#直接拖动一张图片到该软件的目录下
#创建一个yuan的package,把该图片发送到yaun的package中去
#文件传送,要告诉对方你要传送的文件的名字是什么,因为要在对方某个地方存储,没有名字怎么存储呢
#还要告诉对方文件的大小是多少,以便于传送,(判断传送是否完成)


#post_server服务端:在别人的哪里
#必须线开启server端

import socket #socket是一个接口 内部封装了有关ip地址和端口号的信息 并且创建ip和端口号
import subprocess #下面目前就使用一个类Popen,让代码在dos环境下运行
import os

sk = socket.socket() #创建一个socket对象s 服务端的sk对象和客户端的sk对象完全是不一样的
address = ('127.0.0.1',8000) #设置一个元组,元组内放的是ip和端口号:8000
sk.bind(address) #绑定ip和端口号,bind方法后跟的必须是一个元组
sk.listen(3) #3表示服务端最多和三个客户端同时建立通信,但是传送信息的话只能是一个一个的来
print('waiting...')
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #那个post_server.py的上一级目录

while 1:
conn,addr = sk.accept() # 客户端开启之后就一直在这里等待着
#接收将要接收的文件信息
data = conn.recv(1024)
cmd,file_name,file_size = str(data,'utf8').split('|')#先将接收到的data转换为str类型的,再以竖线将str格式的data分开,分别传给三个变量
path = os.path.join(BASE_DIR,'yuan',file_name) #yuan是在post_server上级目录中一个包的名字
file_size = int(file_size)

#接收要写入的文件
f = open(path,'ab') #a表示如果没有该路径path,那么就去创建该路径,b是以bytes类型写,打开文件
has_receive = 0
print('开始写入')
while has_receive != file_size:
data = conn.recv(1024)
f.write(data)
has_receive += len(data)
f.close()
print('写入成功')


#Author:'haijing'
#date:2018/11/14

#post_client客户端
#必须线开启server端
#此代码可以执行输入的dos环境下的命令,并返回执行的命令的结果

import socket
import os

sk = socket.socket() #创建socket对象 服务端的sk对象和客户端的sk对象完全是不一样的
address = ('127.0.0.1',8000) #设置元组 里面放的是需要连接的服务器的ip地址
sk.connect(address) #连接ip地址为127.0.0.1的服务端

BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #post_client.py的上一级目录
while 1:
#jing发 不能发空,否则对方会停在阻塞的状态
inp_jing = input('>>>') #输入上传的命令,例如post|post.jpg 这里是相对路径
cmd,path = inp_jing.split('|') #以竖线将输入的内容分开,并分别传递给cmd和path
path = os.path.join(BASE_DIR,path) #路径的拼接,生成要上传的文件的绝对路径

file_name = os.path.basename(path) #basename的作用是取到path最后的文件名字 例此时filename=post.jpg
file_size = os.stat(path).st_size #拿到文件的大小,例post.jpg文件的大小

#发送文件信息
file_info = 'post|%s|%s' %(file_name,file_size) #字符串拼接
sk.sendall(bytes(file_info,'utf8')) #首先给server端发送要发送的命令和文件信息

#发送文件
# with open(path,'rb') as f #rb表示以bytes读
f = open(path,'rb')
has_send = 0
print('开始发送')
while has_send != file_size:
data = f.read(1024) #一次读1024个字节的数据,以为是以bytes类型读的,所以是字节
sk.sendall(data)
has_send +=len(data)
f.close()
print('发送成功')

sk.close #关的此客户端是和服务端之间的通信通道,同样server端也是有关掉通信通道的能力,但是server端一般是不会关的

原文地址:https://www.cnblogs.com/YiYA-blog/p/9960846.html