我已经在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连接退出脚本也不起作用,但我并不那么关心。最终,永远不会有理由退出这个。
答案 0 :(得分:1)
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()
...
答案 1 :(得分:0)
经过无情的代码挖掘后,我无法回答第一部分。看起来在这个高级别上你无法检测到套接字关闭。查看(不赞成,我认为,但完全可用)asyncore和asynchat模块。
至于第二部分,你需要在接收一个&#39;
时断开循环。脸颊代码中的舌头样本:
break