Python线程项目:TCP服务端提供多客户端上传功能

在上一篇博客中,结合多线程知识和tcp协议在python特点与函数,完成了TCP服务端提供多客户端下载功能。本篇博客在上一篇基础上功能升级,服务器接收多个客户端上传的文件,并存储。

需求分析:

客户端向服务器端上传图片
客户端有一张图片,上传到服务器端。连接服务器函数connect ,发送请求给服务器,接收服务器相应数据 字节数组,读取文件,然后在给服务器发数据send ----》使用单线程

服务器端可以或得到多个客户端传来的图片进行本地存储。同时多个客户端并发访问----》多线程。可接受文件名,接受客户端的信息,存放到文件当中。

涉及知识点与上一篇相同:

  1. 多线程的基本操作
  2. tcp协议在线程中运行接收客户端信息
  3. 创建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()

接下来就可以运行服务端代码,开启服务器,等待客户端运行上传文件了~~大家可以自己编写一下,尝试运行!!

感谢您的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值