簡體   English   中英

異步服務器:請求導致“ socket.error'>:[Errno 32]管道損壞)”

[英]asyncore server: Request resulting in “socket.error'>:[Errno 32] Broken pipe)”

我正在編寫一個異步服務器,該服務器在同一過程中從另一個模塊中獲取信息,並將其寫回到客戶端。 該信息基本上是一本字典,其中每個鍵都有一排消息。 我需要轉儲每個隊列的長度。 該代碼在測試機上運行良好,但是一旦將其安裝在生產服務器上,我就會開始收到以下錯誤消息:“ socket.error'>:[Errno 32]管道損壞)”。

這是服務器:

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()

提前致謝。

那是您必須處理的錯誤情況。 有時連接會關閉。 與生產環境相比,在開發過程中遇到不同的套接字錯誤是正常現象,因為存在許多不同的可能錯誤,並且它們幾乎完全取決於執行環境,連接另一端的程序在做什么以及執行什么操作。客戶端和服務器之間的所有路由器都決定執行此操作。

因此,對您的問題的字面回答是,您需要在應用程序代碼中處理此錯誤以及許多其他套接字錯誤。 當您使用異步時,這是您工作的一部分。 添加必要的異常處理,並在發生這種情況時將連接標記為已關閉。

更好的答案是,有一些更高級的工具可以使網絡編程更容易,您應該考慮使用這些工具。 這方面的大事是Twisted

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM