服务器端
import socket
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 获取绝对路径
sk = socket.socket()
address = ('127.0.0.1', 8000) # 地址
sk.bind(address) # 绑定
sk.listen(4) # 监听
while 1:
conn, addr = sk.accept() # 阻塞
while 1:
# 接收文件信息 并解析
data = conn.recv(1024)
cmd, filename, filesize = str(data, 'utf8').split('|')
path = os.path.join(BASE_DIR, 'pic', filename)
filesize = int(filesize)
# 接收文件
f = open(path, 'ab')
has_receive = 0
while has_receive != filesize:
data = conn.recv(1024)
f.write(data)
has_receive += len(data)
f.close()
sk.close()
客户端
import socket
import os
sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
while 1:
# 发送文件信息
inp = input('>>>').strip()
cmd, path = inp.split('|') # post socket.png
path = os.path.join(BASE_DIR, path) # 获取绝对路径 路径与文件名拼接
filename = os.path.basename(path) # 获取文件名
file_size = os.stat(path).st_size # 获取文件大小
file_info = 'post|%s|%s' % (filename, file_size) # 字符串拼接 打包
sk.sendall(bytes(file_info, 'utf8'))
# 发送数据
f = open(path, 'rb') # 二进制格式读取
has_sent = 0 # 记录已发送数据大小
while has_sent != file_size:
data = f.read(1024) # 一段一段发
sk.sendall(data)
has_sent += len(data) # 已发送数据大小累加
f.close()
print('post successful')
记得在上述文件同级目录下新建一个文件夹pic用于接收文件
在客户端运行端口输入 'cmd|img.png' 其中cmd 为post img.png为上传目标图片,事前放进同级目录下。也可以自己填文件路径
例如:我的文件为:socket.png
你也可以右键上图另存为socket.png 然后放进上面同级目录下
然后运行服务器端和客户端,在客户端终端输入 post|socket.png
如果提示post successful就完成文件上传操作了。