首页 > 其他分享 >NonBlocking 非阻塞IO 状态下的实现单线程协程socket通信

NonBlocking 非阻塞IO 状态下的实现单线程协程socket通信

时间:2023-04-01 23:01:27浏览次数:42  
标签:协程 socket server try while NonBlocking data conn

# 服务器端

# -*- coding: utf-8 -*-
import time
from socket import *

server = socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8081))
server.listen(5)
server.setblocking(False) # 至关重要的一步!!!
conn_l = []
print('waiting...')
while True:
    try:
        print(f'total connections {len(conn_l)}')
        time.sleep(2)
        conn,addr = server.accept()
        conn_l.append(conn)

    # 对于整个大的while 循环来说,一直都没有结束,如果while里面的try条件成立,conn_l列表的值加1
    # 对于下一次循环来说,如果try的条件不成立,则对于conn_l列表来说,会再一次尝试接收数据,如果有收到就继续执行,没有收到就pass
    # 为什么对于conn_l 列表的长度改变了,但是却没有报错,对于for 循环,改变了循环条件? 在外部while 循环可以改,在循环的时候不要修改
    # 的确能实现单线程下的并发,但是死循环,对CPU的占用率会变高,
    except BlockingIOError:
        del_l = []
        for conn in conn_l:
            try:
                data = conn.recv(1024)
                if len(data) == 0:
                    del_l.append(conn)
                    continue
                conn.send(data.upper())
            except BlockingIOError:
                pass
            except ConnectionResetError:
                del_l.append(conn)

        for conn in del_l:
            conn_l.remove(conn)

# 客户端
# -*- coding: utf-8 -*-
import os
from socket import *

client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1',8081))


while True:
    msg = f" {os.getpid()} say hello"
    client.send(msg.encode('utf-8'))
    data = client.recv(1024)
    print(data.decode('utf-8'))

标签:协程,socket,server,try,while,NonBlocking,data,conn
From: https://www.cnblogs.com/mrsphere/p/17279637.html

相关文章

  • 协程
    目录引子协程介绍Gevent模块协程代码实战猴子补丁猴子补丁的功能(一切皆对象)monkeypatch的应用场景猴子补丁使用协程实现高并发1服务端客户端协程实现高并发2服务端客户端引子之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的......
  • c++socket编程之客户端编写
    开头用WINAPI完成了socket客户端的编写cursor很适合用于写这种单文件的WINAPI代码编写,写的很规范,它帮助我完成了API的调用,参数的选择和异常值处理,自己去写还挺费时间但不得不吐槽下,我提的几个处理中文和处理多任务的需求,无论我换何种说法,它实现的都不太好,甚至还有错误功......
  • c++ socket编程之成品展示
    开头前面两篇介绍了服务端和客户端的编写,本篇展示运行效果多次测试,修复了bug,目前运行稳定,能够用于生产环境支持多个连接,能够同时处理多个数据传输任务效果展示服务端初始界面......
  • c++ socket编程之服务端编写
    开头想要写一个带界面、功能全面、传输高效、运行稳定的马儿,能够在生产环境下工作在cursor的帮助下,用一天时间完成了服务端和客户端的编写另外一天时间卡在了中文消息传输处理和大文件传输粘包、分包问题上功能收发消息,支持中文消息发送命令执行并显示命令执行结果任意......
  • 渡一教育_Java每日一练:建立Statement的作用是什么、前端Console.log( Boolean(‘‘))
    系列文章目录文章目录系列文章目录题目1java部分建立Statement的作用是什么(答案在最后公布)题目1-答案==解析====答案==题目2前端js部分==答案==题目3前端js部分如下代码输出的是什么答案和解析如下==解析==题目4如果希望1监听TCP端口为9000,服务端应该怎样创建socket题目答......
  • 协程
    协程#协程的概念在操作系统中,压根不存在的,操作系统中,只有进程和线程的概念,他们俩个都是由操作系统调度的#协程是用户态的轻量级线程:用户态===>程序员#协程是单线程下的并发#并发:切换和保存状态开启协程fromgeventimportspawndefres(a,b):print(a)print(b)......
  • jmeter中测试websocket接口
    一、jmeter安装对应的插件1、Jmeter不自带WebSocket功能,需要先安装WebSocket的插件,选项中选择pluginsManager; 2、在availableplugins搜索WebSocket进行插件下载即可,我是将搜索到的2个插件都安装了,待Jmeter重启后插件就是安装成功。二、WebSocketSampler组件添加方式:1、......
  • Thrift TSocket::write_partial() send() errno = 10053问题记录分析
    场景南浔项目,服务器日志打印大量的异常日志:TSocket::write_partial()send()<Host:::ffff:41.230.95.17Port:63165>errno=10053提示服务器发送数据给客户端失败,然后主动断开连接。根据日志可以接收到客户端的登陆请求和心跳信息因为客户端每一次登陆过来,服务器都无法成功发送......
  • HTTP,TCP,SOCKET区别
    1、TCP连接要想明白Socket连接,先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。建立起一个TCP连接需要经过“三次握手”:第一次......
  • ClientWebSocket支持Win7和.net45
    namespaceTestApp{classProgram{conststringWSS_TEST_SERVER="wss://echo.websocket.org";staticvoidMain(string[]arg......