我正在写一个服务器代码来监听来自套接字的信息,但是当我按下字母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发送“消息”时,不会阻止程序的其余部分。
你能帮帮我吗? 感谢答案 0 :(得分:0)
为什么您希望它进入读段?应该怎么读才知道它不是?换句话说,你怎么知道它应该到达那里?如果没有新的连接或数据发送到此,则选择将永远不会触发读取,因为没有读数可做。
但是,这段代码并不好,因为你的垃圾邮件部分是垃圾邮件,因为你的套接字(几乎)总是可写的。你应该只在你想要写东西时选择写。如果检查CPU,几乎可以保证100%的利用率。
理想情况下,您会找到一个库,它允许您将键盘输入添加为可选对象,以便您可以在选择中查找键盘命中。但是,我不知道在python中是否有办法做到这一点。
答案 1 :(得分:0)
您忘记了select.select的超时,因此它在那里阻塞。这是一个等待长达100毫秒(0.1秒)的示例:
(sread, swrite, serr) = select.select(inputs, outputs, [], 0.1);