基于socket实现文件上传
客户端代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
这个是实现上传文件
首先让客户端传递给服务端文件的大小,
然后读取文件,之后发送给服务端
"""
import os
import socket
obj = socket.socket()
obj.connect(("127.0.0.1",111)) #阻塞
ret_bytes = obj.recv(1024)
ret_str = str(ret_bytes,encoding="utf-8")
print(ret_str) #发送当前文件大小
size = os.stat("f.png").st_size
obj.sendall(bytes(str(size),encoding="utf-8")) #发送文件
with open("f.png","rb") as f:
for line in f:
obj.sendall(line)
obj.close()
服务端
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
先接收客户端传递过来文件的大小
之后开始读取文件,并且做一个判断,如果大小读取完毕之后关闭
"""
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",111))
sk.listen()
#连接客户端信息
while True:
conn,adress = sk.accept()#开始阻塞
conn.sendall(bytes("welcome entry FTP",encoding="utf-8"))
#先接收文件大小,然后开始接收客户端信息
file_size = str(conn.recv(1024),encoding="utf-8")
print(file_size)
totle_size = int(file_size)
#传递过来开始大小为0
has_recv = 0
#以二进制方式接收,因为sendall发送的是二进制文件
f = open("new.png","wb")
#接收文件内容,直到获取完毕
while True:
if totle_size == has_recv:
break
data = conn.recv(1024)
f.write(data)
has_recv = len(data)
f.close()