我刚刚发布了我的计划的一部分。我第一次运行程序时,我可以从客户端给出输入,服务器交叉接受,但是当程序运行第二次循环时,它会卡在heroku run rake db:seed
中。使套接字无阻塞并不能解决这个问题。有谁知道如何清除此错误?
mysocket.accept
客户计划:
class Memory(threading.Thread):
def __init__ (self):
threading.Thread.__init__ (self)
def run(self):
global data_queue
while True:
sleep(0.1)
mysock.listen(5)
print "waiting for data"
conn, addr = mysock.accept()
print "received data from client"
data = conn.recv(1000)
data_queue.put(data)
class Execute(threading.Thread):
def __init__ (self):
threading.Thread.__init__ (self)
def run(self):
global data_queue
while True:
if not data_queue.empty():
data = data_queue.get()
if not data:
break
if data == b'on':
print "on"
gpio.output(4,True)
if data == b'off':
print "off"
gpio.output(4,False)
答案 0 :(得分:0)
我相信你想要的内存线程是:
def __init__ (self):
threading.Thread.__init__ (self)
def run(self):
global data_queue
mysock.listen(5)
print "waiting for data"
while True:
sleep(0.1)
conn, addr = mysock.accept()
print "received connection from client"
self.talk_to_client(conn)
def talk_to_client(self, conn):
data = conn.recv(1000)
while data != 'quit':
reply = prepare_reply_to_client(data)
data_queue.put(reply)
conn.close() # if we're done with this connection
注意我是如何将监听移动到while循环之上的,所以它只发生一次。你的问题是你第二次调用listen()与第一次调用冲突。你应该只拨打一次听。后续接受将克隆侦听套接字并将其用于连接。然后,在完成连接后关闭该连接,但是您的监听继续等待新连接。
以下是python文档中的规范示例:https://docs.python.org/2/library/socket.html#example
更新:通过编写方法talk_to_client(conn)
添加与客户端的扩展交互的示例