在上一篇博客中,结合多线程知识和tcp协议在python特点与函数,完成了TCP服务端提供多客户端下载功能。本篇博客在上一篇基础上功能升级,服务器接收多个客户端上传的文件,并存储。
需求分析:
客户端向服务器端上传图片
客户端有一张图片,上传到服务器端。连接服务器函数connect ,发送请求给服务器,接收服务器相应数据 字节数组,读取文件,然后在给服务器发数据send ----》使用单线程服务器端可以或得到多个客户端传来的图片进行本地存储。同时多个客户端并发访问----》多线程。可接受文件名,接受客户端的信息,存放到文件当中。
涉及知识点与上一篇相同:
- 多线程的基本操作
- tcp协议在线程中运行接收客户端信息
- 创建TCP网络协议服务端和客户端
实现功能代码:
首先完成接收客户端信息的线程的编写。
import threading,os
class UploadThread(threading.Thread):
def __init__(self,client,path):
threading.Thread.__init__(self)
self.client = client
self.path = path
def run(self):
#接受的工作
info = self.client.recv(1024)
fname = info.decode('utf-8') #junjun.png
abspath = os.path.join(self.path,fname)
if fname.endswith('.png'):
self.client.send('ok'.encode('utf-8'))
#继续接受文件内容
fbytes = self.client.recv(1024*1024)
if fbytes!=None:
#写入到文件当中
with open(abspath,'wb') as f:
f.write(fbytes)
self.client.close()
新建py文件,创建服务器端,新建并运行线程。
import socket
from server_uthread import UploadThread
if __name__ == '__main__':
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',6666))
server.listen(5)
path = 'D:/image'
while True:
clientSocket,clientAddr = server.accept()
#开启线程
ut = UploadThread(clientSocket,path)
ut.start()
新建py文件,编写能够上传文件的客户端代码。
import socket
if __name__ == '__main__':
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',6666))
path = 'zhu.png'
#发送名称
client.send('zhu.png'.encode('utf-8'))
rinfo = client.recv(1024)
if rinfo.decode('utf-8') == 'ok':
#读取文件内容
with open(path,'rb') as f:
mess = f.read()
client.send(mess)
client.close()
接下来就可以运行服务端代码,开启服务器,等待客户端运行上传文件了~~大家可以自己编写一下,尝试运行!!
感谢您的阅读!