【问题标题】:use select() to listen on both tcp and udp message使用 select() 监听 tcp 和 udp 消息
【发布时间】:2011-07-06 20:50:06
【问题描述】:

当我尝试此代码时,我只收到 TCP 消息:

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()

【问题讨论】:

    标签: python sockets select tcp udp


    【解决方案1】:
    1. 去掉 read_tcp() 和 read_udp() 中的“while”循环。 select() 循环是您唯一需要的循环:它将根据需要经常调用 read_XXX() 方法。 read_XXX() 方法应该只处理一个事件。

    2. 您的 read_tcp() 方法应分为两部分:一个接受套接字并将其添加到选择集中,另一个用于读取接受的套接字。相应地调整选择循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2013-07-25
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      相关资源
      最近更新 更多