返回顶部
首页 > 资讯 > 后端开发 > Python >3Python全栈之路系列之基于sock
  • 536
分享到

3Python全栈之路系列之基于sock

之路系列之Python 2023-01-31 01:01:44 536人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

发布时间:2017年3月16日 00:04 浏览(106) 评论(0) 分类:python前言此处没有前言粘包在实现发送文件功能之前我们先来理解下粘包的问题,下面有两张图,我觉得很清晰的就可以理解到了。正常情况下发送文件第一步: 客户端把获

发布时间:2017年3月16日 00:04 浏览(106) 评论(0) 分类:python

前言

此处没有前言


粘包

在实现发送文件功能之前我们先来理解下粘包的问题,下面有两张图,我觉得很清晰的就可以理解到了。

wKioL1j9mWHQYF_vAAA8UhPFDD0085.png-wh_50

  1. 第一步: 客户端把获取到的文件总大小(size=65426)先放到缓冲区,然后发送给服务端

  2. 第二步: 此时客户端接收到的文件总大小就是65426

wKiom1j9mYKz8LdoAABGPCwrw88069.png-wh_50

  1. 第一步: 客户端把获取到的文件总大小(size=65426)先放到缓冲区

  2. 第二步: 此时可能由于文件读取太快,导致缓存区的内容还没有发送到服务端,客户端就把读取到的文件内容(hello)也放到缓存区;

  3. 第三步: 然后客户端就把缓存区的全部内容都发送到服务端,那么客户端本来第一次应该接收到的数据室文件大小(size=65426),但实际接收到的数据确实:65426+hello,那么这个流程就是粘包的问题;

  • 解决粘包问题

如果出现粘包的问题,那么传输的数据就有问题了,如何解决这个问题呢?看下图:

wKioL1j9mbTALMTKAABKZhWg0wk389.png-wh_50

  1. 第一步: 客户端把文件大小放到缓冲区

  2. 第二步: 放入缓冲区之后立刻陷入阻塞的状态,登台服务端回复已收到文件大小,此时是不会再向服务端发送任何数据的

  3. 第三步: 缓存区的数据会发送到服务端

  4. 第四步: 服务端接收到客户端发来的文件大小之后立刻回复客户端,说我收到你发过来的文件大小了;

文件上传

执行结果如下

wKioL1j9mcqSOIRyAAFF6SO1mEY782.png-wh_50

client.py文件内容

ansheng@Darker:~/Socket_file$ cat client.py
#!/usr/bin/env Python
# _*_coding:utf-8 _*_

import socket
import os

# 创建一个socket对象
obj = socket.socket()

# 服务端的IP和端口
obj.connect(('127.0.0.1', 6542))

# 用os模块获取要传送的文件总大小
size = os.stat("old_file.txt").st_size

# 把文件总大小发送给服务端
obj.sendall(bytes(str(size), encoding="utf-8"))

# 接受服务端返回的信息
obj.recv(1024)

# 以rb的模式打开一个要发送的文件d
with open("old_file.txt", "rb") as f:

    # 循环文件的所有内容
    for line in f:
        # 发送给服务端
        obj.sendall(line)
        
# 关闭退出
obj.close()

service.py文件内容

ansheng@Darker:~/socket_file$ cat service.py
#!/usr/bin/env python
# _*_coding:utf-8 _*_

import socket

# 创建一个socket对象
sk = socket.socket()
# 允许连接的IP和端口
sk.bind(('127.0.0.1', 6542))
# 最大连接数
sk.listen(5)

while True:
    # 会一直阻塞,等待接收客户端的请求,如果有客户端连接会获取两个值,conn=创建的连接,address=客户端的IP和端口
    conn, address = sk.accept()
    
    # 客户端发送过来的文件大小
    file_size = str(conn.recv(1024),encoding="utf-8")
    
    # 给客户端发送已经收到文件大小
    conn.sendall(bytes("ack", encoding="utf-8"))
    
    # 文件大小转换成int类型
    total_size = int(file_size)
    
    # 创建一个默认的值
    has_recv = 0
    
    # 打开一个新文件,以wb模式打开
    f = open('new_file.txt', 'wb')
    
    # 进入循环
    while True:
    
        # 如果传送过来的大小等于文件总大小,那么就退出
        if total_size == has_recv:
            break
            
        # 接受客户端发送过来的内容
        data = conn.recv(1024)
        
        # 写入到文件当中
        f.write(data)
        
        # 现在的大小加上客户端发送过来的大小
        has_recv += len(data)
        
    # 关闭
    f.close()

#Python全栈之路 #Socket


--结束END--

本文标题: 3Python全栈之路系列之基于sock

本文链接: https://lsjlt.com/news/184595.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 3Python全栈之路系列之基于sock
    发布时间:2017年3月16日 00:04 浏览(106) 评论(0) 分类:Python前言此处没有前言粘包在实现发送文件功能之前我们先来理解下粘包的问题,下面有两张图,我觉得很清晰的就可以理解到了。正常情况下发送文件第一步: 客户端把获...
    99+
    2023-01-31
    之路 系列之 Python
  • 3Python全栈之路系列之Rabbit
    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件。RabbitMQ服务器是用Erlang语言编写的,它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全,RabbitMQ官网,RabbitM...
    99+
    2023-01-31
    之路 系列之 Python
  • 3Python全栈之路系列之D
    模板是一个文本,用于分离文档的表现形式和内容,模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档。如何使用模板系统在Python代码中使...
    99+
    2023-01-31
    之路 系列之 Python
  • 3Python全栈之路系列之MySQL表
    先创创建一个表用于测试-- 创建数据库 CREATE DATABASE dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- 创建表 CREATE TABLE `tb` (   `i...
    99+
    2023-01-31
    之路 系列之 Python
  • 3Python全栈之路系列之MySQL表内操作
    Python全栈之路系列之MySQL表内操作先创创建一个表用于测试-- 创建数据库 CREATE DATABASE dbname DEFAULT CHARS...
    99+
    2024-04-02
  • 3Python全栈之路系列之字符串数据类
    字符串(str)字符串类型是python的序列类型,他的本质就是字符序列,而且python的字符串类型是不可以改变的,你无法将原字符串进行修改,但是可以将字符串的一部分复制到新的字符串中,来达到相同的修改效果。创建字符串类型可以使用单引号或...
    99+
    2023-01-31
    之路 字符串 数据
  • 2Python全栈之路系列之SQLAchemy
    Python全栈之路系列之SQLAlchemySQLAlchemy的是Python SQL工具包和对象关系映射器,让应用程序开发者的全部功能和SQL的灵活性。它提供了一套完整的众所周知的企业级持久性模式,专...
    99+
    2024-04-02
  • Python全栈之路系列之Python
    The Python interpreter has a number of functions and types built into it that are always available. They are listed her...
    99+
    2023-01-31
    之路 系列之 Python
  • 2Python全栈之路系列之MysQl基本数据类型
    Python全栈之路系列之MySQL基本数据类型MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型,大致可以分为三类:数字类型日期和时间类型字符串类型数字类型类型大小用途BI...
    99+
    2024-04-02
  • 4Python全栈之路系列之Django模型
    Python全栈之路系列之Django模型MTV开发模式把数据存取逻辑、业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的Model-View-Controller(MVC)模式。在这个模式中,Mode...
    99+
    2024-04-02
  • 8Python全栈之路系列之MySQL触发器
    Python全栈之路系列之MySQL触发器l对某个表进行增/删/改操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行增/删/改前后的行为。创建触发器基本语法插入前CREA...
    99+
    2024-04-02
  • Python全栈之路系列之文件操作
    Python可以对文件进行查看、创建等功能,可以对文件内容进行添加、修改、删除,且所使用到的函数在Python3.5.x为open,在Python2.7.x同时支持file和open,但是在3.5.x系列移除了file函数。 Python...
    99+
    2023-01-31
    之路 操作 文件
  • 6Python全栈之路系列之MySQL存储过程
    Python全栈之路系列之MySQL存储过程存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。存储过程过接收的参数参数描述in仅用于传入参数用out仅用于返回值用in...
    99+
    2024-04-02
  • Python全栈之路系列之字符串格式化
    This PEP proposes a new system for built-in string formatting operations, intended as a replacement for the existing '%...
    99+
    2023-01-31
    之路 字符串 系列之
  • Python全栈之路系列之字符串数据类
    字符串(str) 字符串类型是python的序列类型,他的本质就是字符序列,而且python的字符串类型是不可以改变的,你无法将原字符串进行修改,但是可以将字符串的一部分复制到新的字符串中,来达到相同的修改效果。 创建字符串类型可以使用单...
    99+
    2023-01-31
    之路 字符串 数据
  • python 全栈之路
    目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. ...
    99+
    2023-01-30
    之路 python
  • 3Python标准库系列之os模块
    This module provides a portable way of using operating system dependent functionality. If you just want to read or write...
    99+
    2023-01-31
    模块 标准 系列之
  • 7Python全站之路系列之MySQL视图
    Python全栈之路系列之MySQL视图视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,并可以将其当作表来使用。创建视图创建一个名称...
    99+
    2024-04-02
  • 9Python全站之路系列之MySQL SL注入
    Python全栈之路系列之MySQL SQL注入SQL注入是一种代码注入技术,过去常常用于***数据驱动性的应用,比如将恶意的SQL代码注入到特定字段用于实施******等。SQL注入的成功必须借助应用程序...
    99+
    2024-04-02
  • Python全栈之队列详解
    目录1.lock互斥锁2.事件_红绿灯效果2.1信号量_semaphore2.2事件_红绿灯效果3.queue进程队列4.生产者消费者模型5.joinablequeue队列使用6.总...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作