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

时间:2014-10-19 06:59:05

标签: python sockets tcp

我已经在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连接退出脚本也不起作用,但我并不那么关心。最终,永远不会有理由退出这个。

2 个答案:

答案 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