由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的

项目一:用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实现文件传输/并发式聊天的更多相关文章

  1. 洗礼灵魂,修炼python(82)--全栈项目实战篇(10)—— 信用卡+商城项目(模拟京东淘宝)

    本次项目相当于对python基础做总结,常用语法,数组类型,函数,文本操作等等 本项目在博客园里其他开发者也做过,我是稍作修改来的,大体没变的 项目需求: 信用卡+商城: A.信用卡(类似白条/花呗) ...

  2. 洗礼灵魂,修炼python(78)--全栈项目实战篇(6)—— 多级目录菜单之地址管理系统

    相信各位都在在网上买过东西吧?那么今天我的主题就是写个在线购物系统,是不可能的,哈哈(后期确实有这个项目),那么购物都填写过快递地址吧?然后网上查个地址都有地址管理吧? 要求: 1.打印出省.市.县等 ...

  3. 洗礼灵魂,修炼python(77)--全栈项目实战篇(5)—— ATM自动存取机系统

    要求: 1.完成常识中的ATM存取款机功能 2.把ATM机故障考虑进去 3.不能直接输入账户名和卡号等等信息,模拟出插银行卡让ATM机自动读取卡信息 4.密码验证超过三次错误即锁定账户 5.操作类型有 ...

  4. 洗礼灵魂,修炼python(73)--全栈项目实战篇(1)——【转载】前提准备之学习ubuntu

    本篇是为项目实战做准备,学习Linux是必备的,不然都不好意思叫全栈对吧?下面是一位资深大神写的文章,够详细,我也不用浪费时间再写了 原文链接:Ubuntu学习——第一篇 内容: 一. Ubuntu简 ...

  5. 洗礼灵魂,修炼python(80)--全栈项目实战篇(8)—— 计算器

    用正则表达式开发一个计算器,计算用户给定的一串带有加减乘除的公式. 要求:不能使用eval转换字符串 分析: 要求简单,就是计算混合运算,但是不能使用eval直接转换,主要就是把整个式子中的小括号优先 ...

  6. 洗礼灵魂,修炼python(79)--全栈项目实战篇(7)—— 多级目录菜单之地址管理系统升级版

    要求: 1.在上一篇的地址管理系统的基础上做升级改动 2.添加增删改的功能 3.尽量的贴近生活常识中的地址管理 分析: 需求不用多说了,干就完了 相关文件源码地址:github 这次由于要有增删改的操 ...

  7. 洗礼灵魂,修炼python(76)--全栈项目实战篇(4)—— 购物车系统

    要求: 1.基本符合日常购物车的要求(根据你的想法开放性提升功能) 2.展示商品信息,并且可随时上新商品 3.用户购买每一样商品时都对所剩的钱做一次对比,如果够则提示“已购买”,如果不够提示“余额不足 ...

  8. 洗礼灵魂,修炼python(75)--全栈项目实战篇(3)—— 账户注册登录管理系统

    要求: 1.系统可以创建用户和登录用户,根据用户的输入不同,做出不同的反应(创建还是登录) 2.创建用户不能创建已存在的用户名 3.登录用户的操作最多只能有三次,超过三次冻结账户,每使用一次提示用户还 ...

  9. 洗礼灵魂,修炼python(81)--全栈项目实战篇(9)—— 购物商城登录验证系统

    都在线购物过吧?那么你应该体验过,当没有登录账户时,点开购物车,个人中心,收藏物品等的操作时,都会直接跳转到登录账户的界面,然后如果登录一次后就不用再登录,直到用户登出. 是的,本次项目就是做一个登录 ...

随机推荐

  1. 内核第三讲,进入ring0,以及编写第一个内核驱动程序.

    内核第三讲,进入ring0,以及编写第一个内核驱动程序. PS: 请下配置双机调试,下方有可能用到.如果不配置,则你可以不用调试, 博客连接: http://www.cnblogs.com/iBina ...

  2. 解释代码((n & (n-1))== 0)的含义

    思路:初步查看很难一眼分析出表达式是什么含义,我们不妨举例分析一下,假设 n = 5,二进制表示为101,那么 n-1 = 4,二进制表示为100, 5 & 4 = 101 & 100 ...

  3. 1.let命令总结

    1.let用法类似于var,但是let只在所在代码块有效 { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // ...

  4. MyBatis源码解析(四)——DataSource数据源模块

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634880.html 1.回顾 上一文中解读了MyBatis中的事务模块,其实事务操作无非 ...

  5. tcp_wrapper过滤

    1.1 wrap简介 wrap工作在内核空间和应用程序中间的库层次中.在内核接受到数据包准备传送到用户空间时都会经过库层次,对于部分(只是部分)应用程序会在经过库层次时会被wrap库文件阻挡下来检查一 ...

  6. C#基础知识总结(五)

    摘要 其他的数据类型:常量.枚举(enum).结构(struct).数组一.常量 语法:const 类型 变量名 = 变量值 常量称之为值不可变的变量! 在定义的地方赋值,其他的地方不能赋值. 常量变 ...

  7. Linux CentOS 虚拟机下联网

    这里用VM 提供虚拟环境 虚拟机网络连接模式用的NAT 在编辑处 打开 查看你的子网ip  类型是NAT 的 我们这是是18   192.168.18.~ 去看dhcp 设置看自动分配的地址范围 也可 ...

  8. mybatis_02简单操作数据库

    模糊查询用户信息 <!-- [${}]:表示拼接SQL字符串 [${value}]:表示要拼接的是简单类型参数. 注意: 1.如果参数为简单类型时,${}里面的参数名称必须为value 2.${ ...

  9. No.3 数组中重复的数字 (P39)

    题目1:找出数组中重复的数字 [题目描述] 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个 ...

  10. python爬虫入门urllib库的使用

    urllib库的使用,非常简单. import urllib2 response = urllib2.urlopen("http://www.baidu.com") print r ...