use select() to listen on both tcp and udp message(使用 select() 监听 tcp 和 udp 消息)
问题描述
当我尝试此代码时,我只收到 TCP 消息:
I only get the TCP message when I try this code:
from socket import *
from select import select
def read_tcp(s):
while True:
client,addr = s.accept()
data = client.recv(8000)
client.close()
print "Recv TCP:'%s'" % data
def read_udp(s):
while True:
data,addr = s.recvfrom(8000)
print "Recv UDP:'%s'" % data
def run():
host = ''
port = 8888
size = 8000
backlog = 5
# create tcp socket
tcp = socket(AF_INET, SOCK_STREAM)
tcp.bind(('',port))
tcp.listen(backlog)
# create udp socket
udp = socket(AF_INET, SOCK_DGRAM)
udp.bind(('',port))
input = [tcp,udp]
while True:
inputready,outputready,exceptready = select(input,[],[])
for s in inputready:
if s == tcp:
read_tcp(s)
elif s == udp:
read_udp(s)
else:
print "unknown socket:", s
if __name__ == '__main__':
run()
而客户端是这样的:
from socket import *
def send_tcp():
s = socket(AF_INET,SOCK_STREAM)
s.connect(('localhost',8888))
data="TCP "*4
s.send(data)
s.close()
def send_udp():
s = socket(AF_INET,SOCK_DGRAM)
data="UDP "*4
s.sendto(data, ('localhost',8888))
s.close()
if __name__ == '__main__':
send_tcp()
send_udp()
推荐答案
摆脱 read_tcp() 和 read_udp() 中的while"循环.select() 循环是您唯一需要的循环:它将根据需要经常调用 read_XXX() 方法.read_XXX() 方法应该只处理一个事件.
Get rid of the 'while' loops in read_tcp() and read_udp(). The select() loop is the only loop you need: it will call the read_XXX() methods as often as required. The read_XXX() methods should handle exactly one event.
你的 read_tcp() 方法应该分成两部分:一个接受一个套接字并将其添加到选择集中,另一个读取一个接受的套接字.相应地调整选择循环.
Your read_tcp() method should be split into two parts: one to accept a socket and add it to the selection set, and another to read an accepted socket. Adjust the select loop accordingly.
这篇关于使用 select() 监听 tcp 和 udp 消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 select() 监听 tcp 和 udp 消息
基础教程推荐
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 线程时出现 msgbox 错误,GUI 块 2022-01-01
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01
- 筛选NumPy数组 2022-01-01
- 用于分类数据的跳跃记号标签 2022-01-01