热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(day27)subprocess模块+粘包问题+struct模块+UDP协议+socketserver

目录昨日回顾软件开发架构CS架构BS架构网络编程互联网协议socket套接字今日内容一、subprocess模块二、粘包问题三、struct模块四、UDP五、QQ聊天室六、Sock

目录



  • 昨日回顾

    • 软件开发架构

      • C/S架构

      • B/S架构


    • 网络编程

      • 互联网协议


    • socket套接字


  • 今日内容

    • 一、subprocess模块

    • 二、粘包问题

    • 三、struct模块

    • 四、UDP

    • 五、QQ聊天室

    • 六、SocketServer



昨日回顾

软件开发架构


C/S架构



  • Client:客户端


  • Server:服务端


  • 优点

    占用网络资源少,软件的使用稳定


  • 缺点

    用户在使用多个软件要下载客户端,软件每次更新用户也需要更新

    用户体验差



B/S架构



  • Broser:浏览器


  • Server:服务端


  • 优点

    用户不需要下载多个客户端,以浏览器充当所有软件的客户端


  • 缺点

    网络资源占用较大,网络不稳定时,软件的使用也不稳定



网络编程



  • 实现远程通信

    1. 物理连接介质:网卡等

    2. 互联网协议



互联网协议



  1. 应用层

  2. 表示层

  3. 会话层

  4. 传输层

  5. 网络层

  6. 数据链路层

  7. 物理层


物理层



  • 基于电信号发送一堆二进制数据


数据链路层

把二进制数据交给"以太网协议"处理:



  1. 规定好电信号的分组方式


  2. 必须要有一个网卡



    1. mac的地址

      由12位唯一的编码

      ​ 前6位:厂商号

      ​ 后6位:流水号




以太网协议


  • 广播,单播

  • 弊端:广播风暴,无法跨局域网通信


交换机

让多台电脑连接在一起


互联网

让所有电脑都互联到一起


网络层

连接到互联的电脑都需要有一个IP地址



  • IP地址

    • 用于唯一标识计算机(局域网)具体位置

    • 点分十进制

      • 最小值:0.0.0.0

      • 最最大值:255.255.255.255




传输层


TCP/UDP协议


  • TCP:流式协议



    • 基于TCP协议进行通信,必须要创建双向通道



      • 一个是客户端往服务端的管道

      • 一个是服务端往客户端的管道


    • 三次握手,四次挥手



      • 反馈机制

        客户端发送信息,服务端,必须返回确认机制,否则客户端会一直发送请求





应用层



  • http(重点),ftp(了解)


socket套接字

# 服务端.py
import socket
server = socket.socket()
server.bind(('127.0.0.1',8888))
server.listen(5) # 半连接池
while True:
conn,addr = server.accept()
while True:
try:
data = conn.recv(1024).decode('utf-8') # recv数据从内存中获取
if data == 'q':
break
print(data)
conn.send(data.encode('utf-8'))
except Exception as e:
print(e)
break

conn.close()

# 客户端.py
import socket
client = socket.socket()
client.connect(('127.0.0.1'.8888))
while True:
msg = input('>>')
client.send(msg.encode('utf-8'))
if msg == 'q':
break
data = client.recv(1024).decode('utf-8')
print(data)
client.close()

今日内容

一、subprocess模块



  1. 可以通过代码执行操作系统的终端命令


  2. 并返回终端执行命令的结果


import subprocess
cmd = input('cmd>>>:')
obj = subprocess.popen(
cmd, # cmd命令
Shell = True,
stdout = subprocess.PIPE, # 返回正确结果
stderr = subprocess.PIPE # 返回错误结果
)
data1 = obj.stdout.read()
data2 = obj.stderr.read()
result = data1 + data2
print(result.decode('gbk'))

二、粘包问题



  • 服务端第一次发送的数据,客户端无法精确一次性接受完毕,下一次发送的数据就与上一次数据粘在一起

    1. 无法预测对象需要接受的数据大小长度

    2. 多次连续发送数据量小,并且间隔时间短的数据一次性打包发送过去


  • TCP协议特性

    TCP是一个流式协议,会将多次连续发送数据量小,并且间隔时间短的数据一次性打包发送过去



三、struct模块



  • 解决粘包问题, 是一个可以将很长的数据的长度,压缩成固定的一个标记(数据包头)



    • 必须先定义报头,发送报头,在发送真实数据


    import struct
    # 打包压缩
    # i:模式,会将数据长度压缩成4个bytes
    str = '1123fsgsdasfdasfaa'
    # 模拟客户端
    # 包头
    headers = struct.pack('i',len(str))
    print(len(headers)) # 4
    # 模拟服务端
    # headers = conn.recv(4)
    datalen = struct.unpack('i',headers) # 元组(len(str),)
    print(data_len[0]) # len(str)


  • 既想发送文件,又想发送文件的描述信息

    客户端发送字典给服务端

    # 服务端.py
    import socket
    import json
    import struct
    server = socket.socket()
    server.bind(
    ('127.0.0.1', 9527)
    )
    server.listen(5)
    while True:
    conn, addr = server.accept()
    while True:
    try:
    # 先接收报头
    headers = conn.recv(4)
    # 解包获取真实数据长度
    data_len = struct.unpack('i', headers)[0]
    # 获取字典数据真实长度
    bytes_data = conn.recv(data_len)
    back_dic = json.loads(bytes_data.decode('utf-8'))
    print(back_dic)
    except Exception as e:
    print(e)
    break
    conn.close()

    # 客户端.py
    import socket
    import struct
    import json
    import time
    client = socket.socket()
    client.connect(
    ('127.0.0.1', 9527)
    )
    while True:
    send_dic = {
    'file_name': 'jason真实写真集.avi',
    'file_size': 10000000 # 10G
    }
    # json序列化,并转码成bytes类型数据
    json_data = json.dumps(send_dic)
    bytes_data = json_data.encode('utf-8')
    # 先做报头
    headers = struct.pack('i', len(bytes_data))
    client.send(headers)
    client.send(bytes_data)
    time.sleep(10)



四、UDP

UDP是一种传输协议



  1. 不需要建立双向通道

  2. 不会粘包

  3. 客户端给服务端发送数据不需要等待服务端返回接受成功

  4. 数据容易丢失,不安全

# 服务端
import socket
# SOCK_DGRAM:代表UDP
server = socket.scoket(type = socket.SOCK_DGRAM)
server.bind(('127.0.0.1',9527))
msg, addr = server.recvfrom(1024)

# 客户端
import socket
client = socket.socket(type = socket.SOCK_DGRAM)
server_ip_port = ('127.0.0.1',9527)
client.sendto(b'hello',server_ip_port)

五、QQ聊天室

基于UDP实现QQ聊天室

# 服务端
import socket
server = socket.socket(type = socket.SOCK_DGRAM)
server.bind(('127.0.0.1',9527))
while True:
msg,addr = server.recvfrom(1024)
print(addr)
print(msg.decode('utf-8'))

send_msg = input('服务端:')
server.sendto(send_msg.encode('utf-8'),addr)

# 客户端
import socket
client = socket.socket(type = socket.SOCK_DGRAM)
addr= ('127.0.0.1',9527)
while True:
send_msg = input('客户端1:')
client.sendto(send_msg.encode('utf-8'),addr)

back_msg ,addr= client.recvfrom(1024)
print(back_msg.decode('utf-8'))

六、SocketServer

python内置模块,可以简化socket套接字TCP/UDP服务端的代码

import socketserver
# 定义类
class MyTcpServer(socketserver.BaseRequestHandler)
# 重新父类的handler
def handler(self):
# 1. 接收消息
data = self.request.recv() # conn.recv(1024)

# 2. 给客户端发送消息
send_msg = input('服务端:').encode('utf-8')
self.request.send(send_msg)
if __name__= '__main__':
server = socketserver.TCPserver(('127.0.0.1',8888),MyTcpServer)
server.serve_forever()


推荐阅读
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了网络编程的要点,包括InetAddress类获取IP地址的方法,IP地址的定义和表示方法,IPv4和IPv6的区别,以及网络通信协议中的端口和协议类型。 ... [详细]
author-avatar
我是王美慧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有