当前位置:
首页 > temp > python入门教程 >
-
03网络编程从之异步服务器
# 这里异步服务器的实现是借助于select,有关select模块在我上边的博客中有体现。 # zen_utils也是我们自己写的一个脚本。也在上边的磨课中 import select, zen_utils,queue,time def serve(listener,inpouts,outputs,message_queues): while inputs: print('等待开始第一个线程连接1111') # 开始select监听,对input_list中的服务器端的server开始进行监听 # 一旦调用socket的send,recv函数,将会再次调用此模块 # 这里监控三个参数,第一个返回的是可读的list, 第二个存储的是可写的list, 第三个存储的是错误信息的 readable, writeable, errorinfo = select.select(inputs, outputs, inputs) # 这里判断的是有没有客户端进行连接。 for s in readable: # 然后在进行判断是服务端触发的连接还是客户端触发的链接。 if s is listener: # 接收的消息和客户端的IP端口 print(s) connection, client_address = s.accept() print('client:', connection, client_address) # 设置为非阻塞模式。 connection.setblocking(0) # 将客户端连接也加入到inputs监听列表中。 inputs.append(connection) # 加入到要发送的消息队列中。 message_queues[connection] = queue.Queue() else: # 这是客户端发送消息触发的请求。 data = s.recv(1024) if data != b'?' and data != b'': print('客户端{}发送了{}消息', s.getpeername(), data.decode('utf-8')) # 将接收到的消息需要进行回复的答案。放到对应的消息队列中。 print(zen_utils.aphorisms.get(data,b'')) message_queues[s].put(zen_utils.aphorisms.get(data,b'')) if s not in outputs: outputs.append(s) else: print("一个客户端断开了连接", client_address) # 输出端不在监听。 if s in outputs: outputs.remove(s) # 输入端不再监听 inputs.remove(s) # 关闭这个套接字。 s.close() # 删除消息队列中的消息 del message_queues[s] # 下边是处理输出。 for s in writeable: try: message_queue = message_queues.get(s) sent_data = '' if message_queue is not None: # 如果消息队列为空,不阻塞 sent_data = message_queue.get_nowait() else: # 这里触发的客户端关闭连接。 print('客户端关闭连接') except queue.Empty: # 客户端发送完了消息。 print('%s' % s.getpeername()) outputs.remove(s) else: if sent_data != '': s.sendall(sent_data) else: print('客户端关闭连接') # 处理异常情况。 for s in errorinfo: print('有一个异常客户端的连接', s.getpeername()) inputs.remove(s) if s in outputs: outputs.remove(s) s.close() del message_queues[s] time.sleep(1) if __name__ == '__main__': address = zen_utils.parse_command_line('获取IP端口') listener = zen_utils.create_srv_socket(address) # 将定义好的一个套接字传入到列表中。 inputs = [listener] # 处理要发送的数据。 outputs = [] # 要发送的数据 message_queues = {} serve(listener,inputs,outputs,message_queues) 出处:https://www.cnblogs.com/cong12586/p/14094069.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数