Python网络编程笔记二
2024-09-01 11:15:45
使用select模块实现IO多路复用服务端
import socket
import select
#windows上只支持select.select,不支持poll epoll HOST = "127.0.0.1"
PORT = 9999
BUFFSIZE = 1024
ADDR = (HOST, PORT)
#创建服务器端监听套接字
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpSocket.bind(ADDR)
tcpSocket.listen(5)
tcpSocket.setblocking(0) #监听读事件
inputs = [tcpSocket]
#监听写事件
outputs = []
#监听异常事件
exceptions = [] messageDict = {} while True:
#每当有客户端连接时,返回的r_list中包含监听的服务器套接字tcpSocket
#w_list中始终与outputs相同
r_list, w_list, e_list = select.select(inputs, outputs, exceptions, 1)
print(len(inputs))
for r in r_list:
if r == tcpSocket:
request, addr = r.accept()
request.setblocking(0)
#将客户端套接字加入到监听列表中,接下来每当客户端发送数据过来,r_list中即可包含该套接字
inputs.append(request)
messageDict[request] = []
#如果套接字不等于tcpSocket,说明是客户端发送数据
else:
try:
dataBytes = r.recv(1024)
#说明客户端断开连接
#ConnectionResetError
except Exception as e:
#将客户端套接字移除出监听列表
inputs.remove(r)
del messageDict[r]
r.close()
else:
dataStr = str(dataBytes, encoding="utf-8")
messageDict[r].append(dataStr)
# print("接收到来自", r.getpeername(), " : ", dataStr)
# r.sendall(bytes("已经收到您发送的" + dataStr, encoding="utf-8"))
#添加到outputs,下次再循环时w_list中包含数据
outputs.append(r) for w in w_list:
messageList = messageDict[w]
recvData = messageList[0]
del messageList[0]
print("接收到来自", w.getpeername(), " : ", recvData)
w.sendall(bytes("已经收到您发送的" + recvData, encoding="utf-8"))
outputs.remove(w)
tcpSocket.close()
最新文章
- ubuntu安装simplejson模块
- C和指针 第十六章 标准函数库 信号
- Linux新建用户并添加到sudo组
- 精益VS六西格玛
- 使用STL库sort函数对vector进行排序
- SUSE Linux Enterprise Server 设置防火墙开启ssh远程端口
- LightOJ_1248 Dice (III)
- 关于自定义的 XIB cell上的 button如何在控制器里实现点击方法
- anaconda 下多版本Python 安装说明
- 怎么用Sublime查找替换整个文件夹下的所有文件内容?
- transform:rotate3d/tranlate3d
- nginx-高并发配置 第七章
- ajax请求本地文件
- Python不可变对象
- GsonFormat的使用 (转)
- CF1027C Minimum Value Rectangle
- python练习笔记——组合恒等式
- ats编译中增加透明度 选项
- NuGet 让程序集版本变得混乱
- IP地址转换为Int
热门文章
- Nginx 缓存代理
- 在dva框架和create-react-app创建出来的框架中修饰器语法与按需加载引入antd分别配置
- 【Linux】gnuplot命令大全
- (转)理解inode
- 基于PyTorch的Seq2Seq翻译模型详细注释介绍(一)
- java代码简单实现队列
- C#判断文件是否被混淆
- @NOIP2018 - D1T1@ 铺设道路
- 支付宝防并发方案之";一锁二判三更新";
- @bzoj - 4382@ [POI2015] Podział naszyjnika