gpt4 book ai didi

Python Socket - 处理客户端断开连接

转载 作者:可可西里 更新时间:2023-11-01 02:42:44 27 4
gpt4 key购买 nike

我对在 Python 中使用 Sockets 类进行了大量研究,但我很难理解如何实现我的问题的解决方案。我还要明确一点,我完全没有使用 Python 语言的经验。我拼凑的代码来自其他几个示例。它主要有效,我只需要解决最后一个错误。

想法是这个脚本将在树莓派上运行,这将是树莓派的唯一目的。通过 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()
...

关于Python Socket - 处理客户端断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26448159/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com