我在Python中使用Sockets类做了很多研究,但是我很难理解如何实现我的问题的解决方案。让我明确地说,我完全没有使用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()
之前对其进行检查,因为只发送空白行将在剥离空白之后看起来像一个空字符串。在经过不懈的代码挖掘,我无法回答第一部分。看起来在这么高的级别上你没办法检测到一个套接字正在关闭。看看(我觉得不受欢迎,但完全可用)asyncore和asynchat模块。在
至于第二部分,你需要在收到一个'q'时打破循环。在
开玩笑的代码示例:
相关问题 更多 >
编程相关推荐