我已经在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连接退出脚本也不起作用,但我并不那么担心。最终,永远不会有理由放弃这一点。
好吧,现在我们正在某个地方。因此,如果它打破了,服务器仍应保持活动状态,仍然接受传入连接,对吗? AKA,客户端可以重新连接没有问题。 – BHelman 2014-10-19 12:52:53
是的,为每个客户端连接调用一次“句柄”。如果你的服务器来自'ThreadingTCPServer',你甚至可以同时拥有客户端。 – 2014-10-19 17:43:30