Python套接字 - 处理客户端断开连接

Python套接字 - 处理客户端断开连接

问题描述:

我已经在Python中使用套接字类做了大量的研究,但是我很难理解如何实现我的问题的解决方案。让我也清楚地说,我对Python语言绝对没有经验。我已经凑到一起的代码是来自其他几个例子。它主要起作用,我只想找出最后一个错误。Python套接字 - 处理客户端断开连接

想法是这个脚本将运行在覆盆子pi上,这将是Pi的唯一目的。通过TCP,您将请求图像编号,并且Pi将全屏显示该特定图像。很简单,对吧?

再说一遍,除非客户端的以太网连接被切断,或者客户端关闭了连接,否则一切都有效。然后脚本进入一个坏的无限循环,CPU使用率最大化,并且我别无选择,只能物理地使PI循环。我需要一种方法来确保不会发生这种情况,并且在出现断开连接/网络故障等情况时,客户端可以重新建立与此服务器的连接。

这是我到目前为止。

import sys 
import pygame 
import SocketServer 

pygame.init() 
screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN, 0) 
pygame.mouse.set_visible(False) 
imagesequence = [] 
imagesequence.append(pygame.image.load("/home/pi/appfiles/image1.png") 
imagesequence.append(pygame.image.load("/home/pi/appfiles/image2.png") 

screensaver = [] 
screensaver.append(pygame.image.load("/home/pi/appfiles/screensaver1.png") 

class MyTCPHandler(SocketServer.StreamRequestHandler): 
    def handle(self): 
     while True: 
      self.data = self.rfile.readline().strip() 

      isNum = False 

      try: 
       int(self.data) 
       isNum = True 
      except ValueError: 
       isNum = False 

      if isNum: 
       framenumber = int(self.data) 
       if framenumber >= 1 and framenumber <= len(imagesequence): 
        screen.blit(imagesequence[framenumber-1], (0,0)) 
        pygame.display.flip() 
       elif framenumber >= 901 and framenumber <= 900+len(screensaver): 
        screen.blit(screensaver[framenumber-901], (0,0)) 
        pygame.display.flip() 
      else: 
       if self.data == "q": 
        pygame.quit() 
        server.shutdown() 

if __name__ == "__main__": 
    HOST, PORT = "192.168.1.51", 5050 

    SocketServer.TCPServer.allow_reuse_address = True 
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 

    server.serve_forever() 

通过TCP连接退出脚本也不起作用,但我并不那么担心。最终,永远不会有理由放弃这一点。

self.rfile.readline()返回空字符串''当插座连接被关闭。不过,请确保在应用.strip()之前检查它,因为发送空白字符串在删除空格后看起来像空字符串。

import socketserver 

class MyTCPHandler(SocketServer.StreamRequestHandler): 
    def handle(self): 
     while True: 
      self.data = self.rfile.readline() 
      if not self.data: 
       break 
      self.data = self.data.strip() 
      ... 
+0

好吧,现在我们正在某个地方。因此,如果它打破了,服务器仍应保持活动状态,仍然接受传入连接,对吗? AKA,客户端可以重新连接没有问题。 – BHelman 2014-10-19 12:52:53

+0

是的,为每个客户端连接调用一次“句柄”。如果你的服务器来自'ThreadingTCPServer',你甚至可以同时拥有客户端。 – 2014-10-19 17:43:30

无情的代码挖掘后,我无法回答第一部分。看起来在这个高级别上没有办法检测到套接字关闭。看看(不受欢迎,我认为,但完全可用)asyncore和asynchat模块。

至于第二部分,你需要在收到'q'时从循环中断开。

舌脸颊代码示例中:

break 
+0

呵呵,我很欣赏这个例子和你的努力。第二部分我应该更具体些。我遇到的特殊问题是pygame没有正确退出。一旦脚本全屏显示,即使退出后,它也将永远保持黑色全屏。我无法回到Bash的生活中。但是,是的,我应该包括一个良好形式的休息。 – BHelman 2014-10-19 12:55:31