day36

subprocess模块

  1. 可以帮你通过代码执行操作系统的终端命令。
  2. 并返回终端执行命令后的结果。
import subprocess
cmd = input('cmd>>:')

obj = subprocess.Popen(
	cmd,
    # Shell = True
    shell = True,
    # 返回正确结果参数
    stdout = subprocess.PIPE,
    # 返回错误结果参数 error
    stderr = subprocess.PIPE
)

result = obj.stdout.read() + obj.stderr.read()
print(result.decode('gbk'))

struct模块补充

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

import struct

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

# 报头
# 模拟客户端
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

socket_server使用

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

​ 简化TCP与UDP服务端diamante

​ 必须要创建一个类

# 定义类
# TCP:必须继承BaseRequestHandler类
class MyTcpServer(sockerserver.BaseRequestHandler):
    # 必须重写父类的handler,当客户端连接时会调用该方法
    def handler(self):
        print(self.client_address)
        
        while True:
            try:
                # 1.接收信息
                # request.recv(1024) == conn.recv(1024)
                data = self.request.recv(1024).decode('utf-8')
                
                send_msg = data.upper()
                
                self.request.send(send_msg.encode('utf-8'))
                
            except Exception as e:
                print(e)
                break
                
                
if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(
    	('127.0.0.1',8888),MyTcpServer
    )
    # 永久执行服务
    server.server_forever()
                

粘包问题

服务端第一次发送的数据,客户端无法精确一次性接受完毕,

下一次发送的数据与上一次数据粘在一起了。

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

TCP协议特性:

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

解决粘包问题:

struct模块

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

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

# 客户端发送字典给服务端
send_dic = {
    file_name: 文件名
    file_size: 文件的真实长度 100000
}
# 通过json模块序列化成bytes数据
json_data = json.dumps(send_dic)
bytes_data = json.data.encode('utf-8') # bytes
# 先获取字典的报头
headers = struct.pack('i',len(bytes_data))
# 服务端接收到字典,并接收文件的真实数据

上传大文件

客户端服务端上传达文件

UDP

是一种传输协议

  1. 不需要建立双向通道。
  2. 不会粘包
  3. 客户端给服务端发送数据,不需要等待服务端返回接收成功
  4. 数据容易丢失,数据不安全。

TCP:就好比在打电话。

UDP:就好比在发短信。

posted @ 2019-10-18 21:37  Isayama  阅读(110)  评论(0编辑  收藏  举报