Python选择阻止

时间:2013-09-12 17:42:07

标签: python sockets select

我正在写一个服务器代码来监听来自套接字的信息,但是当我按下字母P时,我必须向客户端发送一条“消息”。以下是我到目前为止所做的事情:

import select
import Queue
import socket
import time
import sys
import msvcrt
from msvcrt import getch

n = 0
HOST = ''
PORT = 2323

servsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
servsock.bind((HOST, PORT))
servsock.listen(5)
servsock.setblocking(0)

inputs = [servsock]
outputs = []
message_queues = {}

while 1:
    (sread, swrite, serr) =  select.select(inputs, outputs, []);
    for sock in sread:
        if  sock is servsock:
            (newsock, address) = servsock.accept()
            newsock.setblocking(0)
            print "New connection: ", address
            inputs.append(newsock)
            newsock.send("You are connected")
            outputs.append(newsock)

        else:
            recv_msg = sock.recv(100)
            if recv_msg == "":
                (host, port) = sock.getpeername()
                print "Client %s:%s disconnected" % (host,port)
                sock.close()
                inputs.remove(sock)
                outputs.remove(sock)
            else:
                (host, port) = sock.getpeername()
                print "Client %s:%s sent: %s "% (host,port,recv_msg)           

    for sock in swrite:
        while msvcrt.kbhit():
            if msvcrt.getch() == "p":
                sock.send("Message")

但是看起来像select到达了swrite,进入那里,但是它不再在sread和swrite之间迭代。如果我随时按“1”,它确实会向套接字发送一条“消息”,但它永远不会返回到sread! 我只需要一直读取消息,当我按下键P发送“消息”时,不会阻止程序的其余部分。

你能帮帮我吗? 感谢

2 个答案:

答案 0 :(得分:0)

为什么您希望它进入读段?应该怎么读才知道它不是?换句话说,你怎么知道它应该到达那里?如果没有新的连接或数据发送到此,则选择将永远不会触发读取,因为没有读数可做。

但是,这段代码并不好,因为你的垃圾邮件部分是垃圾邮件,因为你的套接字(几乎)总是可写的。你应该只在你想要写东西时选择写。如果检查CPU,几乎可以保证100%的利用率。

理想情况下,您会找到一个库,它允许您将键盘输入添加为可选对象,以便您可以在选择中查找键盘命中。但是,我不知道在python中是否有办法做到这一点。

答案 1 :(得分:0)

您忘记了select.select的超时,因此它在那里阻塞。这是一个等待长达100毫秒(0.1秒)的示例:

(sread, swrite, serr) =  select.select(inputs, outputs, [], 0.1);