开发者

use select() to listen on both tcp and udp message

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 开发者_如何学Pythoninputready:
            if s == tcp:
                read_tcp(s)
            elif s == udp:
                read_udp(s)
            else:
                print "unknown socket:", s

if __name__ == '__main__':
    run()

And the client is like this:

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


  1. 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.

  2. 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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜