Python套接字处理客户端discon

2024-04-27 00:20:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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连接退出脚本也不起作用,但我不太关心这个问题。最终,再也没有理由放弃了。在


Tags: importself脚本dataifdisplaypi情况
2条回答

当套接字连接关闭时,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()
            ...

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

至于第二部分,你需要在收到一个'q'时打破循环。在

开玩笑的代码示例:

break

相关问题 更多 >