【问题标题】:Program getting stuck at accept statement程序卡在接受语句
【发布时间】:2023-04-07 21:55:01
【问题描述】:

我刚刚发布了我的程序的一部分。第一次运行程序时,我可以提供来自客户端的输入,服务器越过接受,但是当程序运行第二个循环时,它会卡在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)

客户程序:

try:
    a = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print("Failed to create socket")
    sys.exit()

a.connect(('127.0.0.1', 1236))

while True:
    print "1.ON 2.OFF"
    choice = input('Enter your choice')
    if choice == 1:
        try:
            a.sendall(b"on")
        except socket.error:
            print("Failed to send")
            sys.exit()

    if choice == 2:
        try:
            a.sendall(b"off")
        except socket.error:
            print("Failed to send")
            sys.exit()

ms.close()

【问题讨论】:

标签: python class sockets raspberry-pi serversocket


【解决方案1】:

我相信你想要的记忆线程是这样的:

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() 的第二次调用与第一次发生冲突。你应该只调用一次listen。随后的接受将克隆侦听套接字并将其用于连接。完成后关闭该连接,但您的监听会继续等待新连接。

这是 python 文档中的规范示例:https://docs.python.org/2/library/socket.html#example

更新:通过编写方法talk_to_client(conn)添加与客户端的扩展交互示例

【讨论】:

  • 问题依然存在:(
  • 您知道它正在从第二个客户端获取输入吗?如果没有第二个客户端,服务器将在 accept() 处挂起,直到请求下一个连接。
  • 不,虽然我的程序只执行一个客户端,它给出命令。我会发布我的客户程序。
  • @Shriram:这应该足以至少消除代码中的一个错误。您应该使用它发布一个新问题,但使用 real minimal reproducible example,然后引用此问题或直接删除它。如果这不能解决您的问题,您在未显示的代码中还有另一个问题...
  • @Shriram,如果您只有一个客户端,则只接受一个连接。服务器在获得另一个连接之前不会通过第二次接受。这就是 accept() 的用途——它坐在那里等待下一个连接。您的程序正在按照应有的方式运行。
猜你喜欢
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2016-12-13
  • 2018-03-02
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多