python-python基础8(断言,socket进阶)

一、断言

assert断言语句用来声明某个条件是真的,其作用是测试一个条件(condition)是否成立,如果不成立,则抛出异。

一般来说在做单元测试的时候用的比较多,在生产环境代码运行的情况下,不建议使用断言,会让程序abort掉。

什么时候使用断言:
  • 保护性的编程 正常情况下,并不是防范当前代码发生错误,而防范由于以后的代码变更发生错误。
  • 运行时序逻辑的检查 这种情况一般都是很严重的,防止脏数据或者异常数据进入业务系统,主动进行中断处理
  • 单元测试代码 开发或测试人员编写单元测试代码的时候,也会使用断言
data="kobe bryant"

assert type(data) is str
print("断言正确")

上面的例子就是判断data的类型是不是str,如果是,程序就会继续执行,如果不是,那么在assert的时候就会直接报错

二、socket进阶

服务端或客户端在接收数据时,有一个缓冲区,我们可以定义它的大小,如果接收到的数据超过这个大小,那么下一次接收的数据还是上一次没接收完的数据,我们把缓冲区大小改的很大是不科学的,因为我们不知道接收的数据会有多大。所以用循环接收的办法,直到接收完所有数据才打印,具体看以下例子。

server:

import socket,os,time

server=socket.socket()
server.bind(("localhost",9999))

server.listen()
print("service is start,listening...")

while True:
    conn,addr=server.accept()
    print("From {0} connect successfully.".format(addr))

    while True:
        data=conn.recv(1024)
        if not data:
            break               #客户端断开就是没有数据传过来,那就跳出循环等待下一次连接
        data_de=data.decode('utf-8')
        re_data=os.popen(data_de).read()
        print(len(re_data.encode()))     #打印结果数据的大小
        conn.send(str(len(re_data.encode())).encode())      #将结果数据的大小发送给客户端
        client_ack=conn.recv(1024)                     #防止粘包,收到一个确认数据后,再往下执行,这种方法比sleep好,没有延迟
        print("client_ack:", client_ack.decode())      
    #   time.sleep(1)
        conn.send(re_data.encode())     #发送具体的结果数据

server.close()

client:

import socket

client=socket.socket()
client.connect(("localhost",9999))
print("connect successfully")

while True:
    common=input(">>:")
    if len(common) == 0:continue
    client.send(common.encode())
    print("命令已发送")

    recv_size_en=client.recv(1024)     #接收结果大小
    client.send("发送确认,已收到数据大小".encode())     #发送确认数据,防止粘包
    recv_size=int(recv_size_en.decode())
    print("命令结果大小:",recv_size)
    data_size=0
    recv_data=b''   #空字节
    while data_size<recv_size:
        data=client.recv(1024)    #接收结果
        data_size+=len(data)
        print("接收到{0}字节的数据".format(data_size))
        recv_data+=data
    else:
        print("总共接收到{0}字节的数据".format(data_size))
        print(recv_data.decode())

client.close()

猜你喜欢

转载自www.cnblogs.com/jehuzzh/p/12391458.html