Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python asyncore服务器:请求导致;套接字错误'>;:[Errno 32]断管)“;_Python_Asyncore - Fatal编程技术网

Python asyncore服务器:请求导致;套接字错误'>;:[Errno 32]断管)“;

Python asyncore服务器:请求导致;套接字错误'>;:[Errno 32]断管)“;,python,asyncore,Python,Asyncore,我正在编写一个asyncore服务器,它在同一进程中从另一个模块获取信息并将其写回客户端。信息基本上是一个字典,每个键都有一个消息队列。我需要转储每个队列的长度。该代码在测试机器上运行良好,但一旦我将其安装到生产服务器上,我就会收到以下错误消息:“socket.error'>:[Errno 32]break pipe)” 这是服务器: class request_handler (asyncore.dispatcher): def __init__(self, conn_sock, cl

我正在编写一个asyncore服务器,它在同一进程中从另一个模块获取信息并将其写回客户端。信息基本上是一个字典,每个键都有一个消息队列。我需要转储每个队列的长度。该代码在测试机器上运行良好,但一旦我将其安装到生产服务器上,我就会收到以下错误消息:“socket.error'>:[Errno 32]break pipe)”

这是服务器:

class request_handler (asyncore.dispatcher):
    def __init__(self, conn_sock, client_address, dict):
            self.client_address  = client_address
            self.buffer = ""
            self.dict = dict
            asyncore.dispatcher.__init__(self, conn_sock)

    def readable(self):
            return True

    def writable(self):
            return False

    def handle_read(self):
            data = self.recv(SIZE)
            mtats = "msgq-stats"

            if data:
                    buffer = data
                    if buffer.lower() == mstats.lower():
                            msgout = "-- Message Queue Stats --\n"
                            for key, value in dict.items():
                                    mq = 0
                                    if dict[key].message_queue:
                                            mq = len(dict[key].message_queue)
                                    msgout += key + ":" + str(mq) + "\n"
                            self.send(msgout)
                    else:   self.send("Invalid input\n")
            else:
                    self.send("Invalid input\n")

    def handle_write(self):
            print ("--Handling read--\n")

    def handle_close(self):
            pass

# ---------------------------------------------------------------------

class monitor_server (asyncore.dispatcher):
    def __init__ (self, ip, port, destination):
            sys.path.append('/path/')
            import dict

            self.ip = ip
            self.port = port
            self.dict = dict
            asyncore.dispatcher.__init__ (self)
            self.create_socket (socket.AF_INET, socket.SOCK_STREAM)

            self.set_reuse_addr()
            self.bind ((ip, port))
            self.listen (5)

    def writable (self):
            return 0

    def handle_read (self):
            pass

    def readable (self):
            return self.accepting

    def handle_connect (self):
            pass

    def handle_accept (self):
             (conn_sock, client_address) = self.accept()
             request_handler (conn_sock, client_address, self.destination)
这是客户端代码:

class Client(asyncore.dispatcher_with_send):
   def __init__(self, host, port, message):
      asyncore.dispatcher.__init__(self)
      self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
      self.connect((host, port))
      print "Message being sent is "
      print message
      self.out_buffer = message

  def handle_close(self):
      self.close()

  def handle_read(self):
      print self.recv(1024)
      self.close()

 c = Client('', 6000, 'msgq-stats')
 asyncore.loop()

提前感谢。

这是您必须处理的错误案例。有时连接会关闭。开发过程中遇到的不同套接字错误与生产过程中遇到的不同是正常的,因为有太多不同的可能错误,它们几乎完全取决于执行环境、连接另一端的程序在做什么以及客户端和服务器之间的所有路由器决定做什么

因此,您的问题的字面答案是,您需要在应用程序代码中处理此错误和许多其他套接字错误。当您使用asyncore时,这是您工作的一部分。添加必要的异常处理,并在发生类似情况时将连接标记为关闭

稍微好一点的答案是,有更高级的工具使网络编程更容易,并且你应该考虑使用这些工具。这方面最重要的是