洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天
由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的
项目一:用socket实现文件传输
本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket进行项目开发,难不倒各位
项目要求:
1.用socket完成文件上传功能
2.文件位置可以设置
3.传输协议可以为get,和post
4.路径存放位置可以设置
5.服务端实现多用户连接,客户端随意
要求就这么简单,好久没有这么简单的操作了吧?
不多说,直接来。
程序结构:
settings.py:
#!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:
#!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:
#!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:
#!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:
和前面的完全一样,没做任何更改
#!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(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天的更多相关文章
- 洗礼灵魂,修炼python(82)--全栈项目实战篇(10)—— 信用卡+商城项目(模拟京东淘宝)
本次项目相当于对python基础做总结,常用语法,数组类型,函数,文本操作等等 本项目在博客园里其他开发者也做过,我是稍作修改来的,大体没变的 项目需求: 信用卡+商城: A.信用卡(类似白条/花呗) ...
- 洗礼灵魂,修炼python(78)--全栈项目实战篇(6)—— 多级目录菜单之地址管理系统
相信各位都在在网上买过东西吧?那么今天我的主题就是写个在线购物系统,是不可能的,哈哈(后期确实有这个项目),那么购物都填写过快递地址吧?然后网上查个地址都有地址管理吧? 要求: 1.打印出省.市.县等 ...
- 洗礼灵魂,修炼python(77)--全栈项目实战篇(5)—— ATM自动存取机系统
要求: 1.完成常识中的ATM存取款机功能 2.把ATM机故障考虑进去 3.不能直接输入账户名和卡号等等信息,模拟出插银行卡让ATM机自动读取卡信息 4.密码验证超过三次错误即锁定账户 5.操作类型有 ...
- 洗礼灵魂,修炼python(73)--全栈项目实战篇(1)——【转载】前提准备之学习ubuntu
本篇是为项目实战做准备,学习Linux是必备的,不然都不好意思叫全栈对吧?下面是一位资深大神写的文章,够详细,我也不用浪费时间再写了 原文链接:Ubuntu学习——第一篇 内容: 一. Ubuntu简 ...
- 洗礼灵魂,修炼python(80)--全栈项目实战篇(8)—— 计算器
用正则表达式开发一个计算器,计算用户给定的一串带有加减乘除的公式. 要求:不能使用eval转换字符串 分析: 要求简单,就是计算混合运算,但是不能使用eval直接转换,主要就是把整个式子中的小括号优先 ...
- 洗礼灵魂,修炼python(79)--全栈项目实战篇(7)—— 多级目录菜单之地址管理系统升级版
要求: 1.在上一篇的地址管理系统的基础上做升级改动 2.添加增删改的功能 3.尽量的贴近生活常识中的地址管理 分析: 需求不用多说了,干就完了 相关文件源码地址:github 这次由于要有增删改的操 ...
- 洗礼灵魂,修炼python(76)--全栈项目实战篇(4)—— 购物车系统
要求: 1.基本符合日常购物车的要求(根据你的想法开放性提升功能) 2.展示商品信息,并且可随时上新商品 3.用户购买每一样商品时都对所剩的钱做一次对比,如果够则提示“已购买”,如果不够提示“余额不足 ...
- 洗礼灵魂,修炼python(75)--全栈项目实战篇(3)—— 账户注册登录管理系统
要求: 1.系统可以创建用户和登录用户,根据用户的输入不同,做出不同的反应(创建还是登录) 2.创建用户不能创建已存在的用户名 3.登录用户的操作最多只能有三次,超过三次冻结账户,每使用一次提示用户还 ...
- 洗礼灵魂,修炼python(81)--全栈项目实战篇(9)—— 购物商城登录验证系统
都在线购物过吧?那么你应该体验过,当没有登录账户时,点开购物车,个人中心,收藏物品等的操作时,都会直接跳转到登录账户的界面,然后如果登录一次后就不用再登录,直到用户登出. 是的,本次项目就是做一个登录 ...
随机推荐
- MySQL索引的概念
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 索引分为聚簇索 ...
- Hadoop YARN架构设计要点
YARN是开源项目Hadoop的一个资源管理系统,最初设计是为了解决Hadoop中MapReduce计算框架中的资源管理问题,但是现在它已经是一个更加通用的资源管理系统,可以把MapReduce计算框 ...
- es6入门3--箭头函数与形参等属性的拓展
对函数拓展兴趣更大一点,优先看,前面字符串后面再说,那些API居多,会使用能记住部分就好. 一.函数参数可以使用默认值 1.默认值生效条件 在变量的解构赋值就提到了,函数参数可以使用默认值了.正常我们 ...
- python 时间模块time,datetime
模块(module)是 Python 中非常重要的东西,你可以把它理解为 Python 的扩展工具.换言之,Python 默认情况下提供了一些可用的东西,但是这些默认情况下提供的还远远不能满足编程实践 ...
- RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
- 聊聊数据库~2.SQL环境篇
传统数据库 上篇文章:聊聊数据库~开篇 https://www.cnblogs.com/dotnetcrazy/p/9690466.html 本来准备直接开讲NoSQL的(当时开篇就是说的NoSQL) ...
- c++中的new、operator new、placement new
一.定义 1.new new是c++中的关键字,,其行为总是一致的.它先调用operator new分配内存,然后调用构造函数初始化那段内存. new 操作符的执行过程:1. 调用operator n ...
- ABP适配Oracle全过程
一.背景 ABP的各类文档在网络上已经非常完善了,唯独缺少与oralce相关的资料,ABP官网也未给出一个较好的Oracle解决方案.正好最近在学习ABP相关知识,对ABP源码结构稍算熟悉,花了些 ...
- MySQL技巧(三)运算符与函数
- Javascript继承5:如虎添翼----寄生式继承
/* * 寄生式继承 * 其实就是对原型继承的第二次封装,在封装过程中对继承的对象进行了扩展. * 也存在原型继承的缺点!! * 这种思想的作用也是为了寄生组合式继承模式的实现. */ //声明基对象 ...