洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天
由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的
项目一:用socket实现文件传输
本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket进行项目开发,难不倒各位
项目要求:
1.用socket完成文件上传功能
2.文件位置可以设置
3.传输协议可以为get,和post
4.路径存放位置可以设置
5.服务端实现多用户连接,客户端随意
要求就这么简单,好久没有这么简单的操作了吧?
不多说,直接来。
程序结构:
settings.py:
1 2 3 4 5 6 7 8 9 10 11 12 | #!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva # datetime:2018/2/11 0011 22:18 import os base_dir = os.path.dirname(__file__) #默认根目录 transport_type = 'post' #传输方式 dir = 'test' #存放文件夹名,记得事先创建好 path = os.path.join(base_dir, dir ) #存放路径 |
pic_server.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import socket,os import settings s = socket.socket() address = ( '127.0.0.1' , 8800 ) s.bind(address) s.listen( 3 ) base_dir = settings.base_dir def recv(): print ( '服务端启动....' ) conn,addr = s.accept() path = settings.path #设定待存放文件路径 while True : info = str (conn.recv( 1024 ), 'utf8' ) #接受文件名和文件大小 if not info: conn.close() conn,addr = s.accept() continue filename,filesize = info.split( ',' ) #分割出文件名和文件大小 print ( '待传输的文件大小为:%s' % filesize) print ( '请稍后....' ) f = open (os.path.join(path,filename), 'wb' ) #创建文件 recv_size = 0 #已接受数据的值,初始为0 while recv_size ! = int (filesize): #循环接受数据,直到数据接收完整 data = conn.recv( 1024 ) #每次接受1024个字节 f.write(data) #每接受1024个就写入文件 recv_size + = len (data) #每接受一次增加同等值的已接受值 f.close() print ( '传输完成' ) s.close() if __name__ = = '__main__' : recv() |
pic_client.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import socket,os import settings c = socket.socket() addr = ( '127.0.0.1' , 8800 ) base_dir = settings.base_dir def send(): print ( '客户端启动...' ) c.connect(addr) types,filename = input ( '>>>:' ).strip().split( '/' ) #分割出输入的传输方式、文件名 if types ! = settings.transport_type:exit() #传输方式 path = os.path.join(base_dir,filename) #拼凑文件名的绝对路径 filesize = os.stat(path).st_size #文件名的空间大小 info = '%s,%s' % (filename,filesize) c.sendall(bytes(info, 'utf8' )) #传输文件名、文件大小 sent_size = 0 #设定初始值,用于标记已传输的大小 f = open (path, 'rb' ) while sent_size ! = filesize: #循环传入,直到传完整个文件 data = f.read( 1024 ) #每次读取1024个字节大小 if not data: break c.sendall(data) #传输读取的1024个字节 sent_size + = len (data) #每传输一次增加同等值的已接受值 c.close() if __name__ = = '__main__' : send() |
好的,就这么些,我这里测试的是上传名为1.jpg的图片到test文件目录里
先看下1.jpg:
美女对吧。好的,开始测试:
客户端:
服务端:
我们看下test目录:
打开这个目录的1.jpg看看:
这美女已经被我们传到test目录里了,验证的文件大小看看:
和刚才的对比:
好的,是的,那么这个项目就搞定了。很简单对不对
项目二:用socketserver模块实现并发,多用户同时访问
项目要求:使用socketserver模块操作实现多用户同时访问服务端
是的,你没有看错,项目要求就这么一个,最根本的就是熟悉socketserver模块的使用方法就行。
所以本项目的前提,先学习socketserver模块,不用多说,就一句话,socketserver是在socket基础之上开发的,类似于一个框架,里面的大部分东西是给我们写好的,稍微的学习socketserver的使用方法就行,其他和socket是完全没区别的。
好的,不多说,直接上来。
项目结构就两个con_server.py和con_client.py。
con_server.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import socketserver class myserver(socketserver.BaseRequestHandler): def handle( self ): #这里的方法名是固定的,不能是其他的 print ( '服务端启动。。。' ) while True : conn = self .request #和conn,addr = socket.accept()等同 print ( self .client_address) while True : client_data = conn.recv( 1024 ) #接受数据 print ( str (client_data, 'utf8' )) #转为字符串 req = input ( '>>>:' ) #输入数据 conn.sendall(bytes(req, 'utf8' )) #发送数据 conn.close() if __name__ = = '__main__' : server = socketserver.ThreadingTCPServer(( '127.0.0.1' , 8888 ),myserver) server.serve_forever() #服务永远存在,不关闭 |
con_client.py:
和前面的完全一样,没做任何更改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import socket address = ( '127.0.0.1' , 8888 ) c = socket.socket() c.connect(address) print ( '客户端启动。。。' ) while True : data = input ( '>>>:' ) c.send(bytes(data, 'utf8' )) if data = = 'exit' : break res_data = c.recv( 1024 ) print ( str (res_data, 'utf8' )) c.close() |
好的,运行测试:
第一个客户端:
第二个客户端:
第三个客户端:
服务端:
查看结果:
第一个客户端收到信息:
第二个客户端收到信息:
第三个客户端收到信息:
那么就是都收发到了的,服务端回复的内容会按连接的先后顺序依次分发给客户端。那么并发就实现了。
这个真么什么难度,具体就自己下去多研究了
好的,项目结束,都是很简单的小项目
分类:
洗礼灵魂,修炼python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】