网络编程(二)

网络编程二

subprocess模块

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

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

import subprocess

cmd = input('cmd>>:')  # dir
obj = subprocess.Popen(
    # cmd命令
    cmd,
    # Shell=True
    shell=True,
    # 返回正确结果参数
    stdout=subprocess.PIPE,
    # 返回错误结果参数 error
    stderr=subprocess.PIPE
)

result = obj.stdout.read() + obj.stderr.read()

print(result.decode('gbk'))

struct模块

是一个可以将很长的数据的长度,压缩成固定的长度的一个标记(数据报头)。

# 打包压缩
# i:模式,会将数据长度压缩成4个bytes
str1 = 'wataaaaaaaaaaaaa'

# 报头
# 模拟客户端
headers = struct.pack('i', 10000)
print(headers)

print(len(headers))  # 4
# client.send(headers)

# 模拟服务端
# headers = conn.recv(4)
data_len = struct.unpack('i', headers)  # (10000,)
print(data_len[0])  # 真实数据长度10000

粘包问题

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

1.无法预测对方需要接受的数据大小长度。
2.多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。

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

解决粘包问题:

truct模块

必须先定义报头,发送报头,再发送真实数据。

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

        # 客户端发送字典给服务端
            send_dic = {
                file_name: 文件名
                file_size: 文件的真实长度 1000000
            }

            # 通过json模块序列化成bytes数据
            json_data = json.dumps(send_dic)
            bytes_data = json_data.encode('utf-8')  # bytes

            # 先获取字典的报头
            headers = struct.pack('i', len(bytes_data))

        # 服务端接收到字典,并接收文件的真实数据

- 上传大文件
    客户端往服务端上传大文件

- UDP
    UDP是一种传输协议。
        1)不需要建立双向管道。
        2)不会粘包
        3)客户端给服务端发送数据,不需要等待服务端返回接收成功
        3)数据容易丢失,数据不安全。

    - TCP: 就好比在打电话。
    - UDP: 就好比在发短信。

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

  • 简化TCP与UDP服务端代码
  • 必须要创建一个类
posted @ 2019-10-20 20:10  鸿鸿1  阅读(95)  评论(0编辑  收藏  举报