本文通过实例来解说用网络通讯时,通过tcp/ip协议,接收数据时,阻塞(block),超时设置(settimeout)功能
先介绍两个函数:
1、socket.setblocking(True/False),来设置是否阻塞,True时阻塞,False不阻塞。
2、socket.settimeout(time) ,设置超时时间
测试方法:
采用网络调试助手做服务程序设置如下:
状态一:不做任何设置
编写程序 test1.py
# -*- coding:utf-8 -*-
import socket
import time
#-----------------定义函数-----------------------------------------------
#将byte[]转为十六进制字符串
def bytesToHexString( bs ):
hexbytes = ''.join(['%02X ' % b for b in bs])
return hexbytes.strip()
#-----------------主程序-------------------------------------------------
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('127.0.0.1', 8080)) #连接服务器
try:
time_start=time.time() # time_start 保存开始时间
data = clientsocket.recv(10) #recv 10个数据
time_end=time.time() #正常状态下,保存结束时间
except Exception as e: #出错时进入
time_end=time.time() #出错时,保存结束时间
print(e) #打印错误信息
print('非正常结束:',time_end-time_start) #打印 出错时总的使用时间
else: #正常运行时 出口
print('正常结束:',time_end-time_start)
clientsocket.close()
print('接收到的数据:%s,长度:%d'%(bytesToHexString(data), len(data)))
#-------------------结束--------------------------------------------------
在本程序中,采用了try....except Exception.....else结构,except为出错时出口,else为正常运行时出口。
编译并运行程序
结果如下:
1、如果网络调试助手一直不发数据,则程序一直没反应
2、只要发送1个数据 ,则程序立即有反应,并且是正常结束
上图中显示,程序运行了184.0秒,接收数据花了:183.6924..秒,只接收了一个数据
3、通过网络调试助手发送超过10个数据