一、断言
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()