注册 登录
编程论坛 Python论坛

TCP套接字非阻塞示例:萌新学习笔记

zxq0103 发布于 2023-04-27 10:08, 142 次点击
程序代码:

import os,sys
from socket import *
from time import ctime,sleep
# TCP套接字非阻塞示例
#
循环等待连接,当没有连接时,每隔10秒写入一行日志
fw = open('log.txt','a+',encoding='utf-8')
# 以utf-8编码格式打开日志文件追加模式

sockfd = socket()
sockfd.bind(('0.0.0.0',8888))
sockfd.listen(3)

sockfd.setblocking(False) # 设置非阻塞
#
sockfd.settimeout(3) #设置超时时间3秒
time_out = 0
print('Waiting for connect...')
while True:
    # 尝试接收连接,返回套接字和地址
    try: connfd, addr = sockfd.accept()
     # 当出现无连接和超时异常后
    except (BlockingIOError,timeout) as e:
        sleep(0.1) # 延迟0.1秒
        time_out += 1
        if time_out > 100: # 每延迟10秒写一次日志
             # 把错误信息写入日志文件
            fw.write("%s : %s\n"%(ctime(),e))
            fw.flush() # 刷新保存日志文件
            time_out = 0
            print('Waiting for connect...')
    else:
        wait_time = 0
        print('no msg')
        while True:
            try:
                data = connfd.recv(1024)
                print(data)
                connfd.send(b'OK')
                wait_time = 0
            except:
                sleep(0.1) # 无信息异常等待0.1秒  
                wait_time += 1
                if wait_time > 100: # 当10秒无信息,则提示一次
                    print('no msg')
                    wait_time = 0
3 回复
#2
sssooosss2023-04-27 19:04
共同学习
#3
东海ECS2023-04-27 19:20
这段代码是一个使用 TCP 套接字的非阻塞示例,其主要特点是:

1.通过设置套接字为非阻塞模式,使得程序在等待连接或接收数据时不会被阻塞,可以在无须等待的时间内执行其他操作;
2.通过 sleep() 方法来实现延迟操作,延迟的时间可以灵活调整,以免长时间占用 CPU 资源;
3.通过捕捉 BlockingIOError 和 timeout 异常,及时释放 CPU 资源,并记录日志,以便后续调试与分析;
4.使用 while 循环来持续等待客户端数据,通过 try-except 语句捕获异常并在没有接收到数据时等待一段时间,以免出现死循环等不必要的问题。

需要注意的是,该代码是一个简化版的示例,实际使用时应该结合具体应用场景进行相应的优化和修改。
#4
zxq01032023-04-28 10:42
回复 3楼 东海ECS
1