Python TCP服务器在一段时间后停止响应

Python TCP服务器在一段时间后停止响应,python,raspberry-pi,tcpsocket,Python,Raspberry Pi,Tcpsocket,因此,我在我的RPI上编写了这段python代码,以创建一个数字海报,与我的快思聪控制处理器进行对话。出于某种原因,我的代码在一段时间后停止响应。我不知道为什么。我不知道我的Pi是否会睡着,但如果有人能指出我代码中可能导致这种情况的任何东西,请让我知道 编辑:我自己想出来的。非常感谢所有发表评论的人 每次循环时,我都在创建一个新的FBI流程,最后我耗尽了Pi的所有RAM,直到它停止,因为它没有任何剩余。我现在在加载图像后杀死FBI进程,修复了这个问题。谢谢大家的帮助 我的功能和设置: impor

因此,我在我的RPI上编写了这段python代码,以创建一个数字海报,与我的快思聪控制处理器进行对话。出于某种原因,我的代码在一段时间后停止响应。我不知道为什么。我不知道我的Pi是否会睡着,但如果有人能指出我代码中可能导致这种情况的任何东西,请让我知道

编辑:我自己想出来的。非常感谢所有发表评论的人


每次循环时,我都在创建一个新的FBI流程,最后我耗尽了Pi的所有RAM,直到它停止,因为它没有任何剩余。我现在在加载图像后杀死FBI进程,修复了这个问题。谢谢大家的帮助

我的功能和设置:

import socket
import os
import thread
import sys
import urllib
from time import ctime
from PIL import Image
import time
import random
import logging

frameBufferCommand = "sudo fbi -a -T 1 -d /dev/fb0 -noverbose "
moviePosterLocation = "/home/pi/movieposters/"
openBlackImage = "/home/pi/movieposters/special/black.jpg"
killFrameBuffer = "sudo killall fbi"
turnOffScreen = "sudo /opt/vc/bin/tvservice -o"
turnOnScreen = "sudo /opt/vc/bin/tvservice -p"

def splitString(input): 
    stringList = input.split("/x00/") 
    return stringList

def displayRandomPoster():
    displayingPoster = False
    fileCount = next(os.walk(moviePosterLocation))[2] #get the number of available posters
    print('Current # Of Posters in Directory: ' + str(len(fileCount)))

    attemptNumber = 0

    while not displayingPoster:
        posterToDisplay = random.randint(0, len(fileCount))
        print('Trying To Display A Random Poster')
        attemptNumber += 1

        try:
            image = Image.open(moviePosterLocation + fileCount[posterToDisplay]) #open the current image
            width, height = image.size
        except IndexError as msg:
            print("encountered an IndexError while opening an image")
            width = 0
            height = 0      
        except IOError as msg:
            print(msg)
        try:
            conn.send(msg)
        except socket.error as msg:
            print("Socket Error")


    if width > height:
        if attemptNumber > 5:
            print("Too Many Attempts, Stopping")
            break
        else:
            print("We Think This Isnt A Poster, Trying Again")               
            continue    
    else:
        try:
            conn.send("  Displaying Poster: " + str(fileCount[posterToDisplay]))
        except socket.error as msg:
            print msg                
        os.system(frameBufferCommand + moviePosterLocation + fileCount[posterToDisplay])
        displayingPoster = True
        return
正在侦听的线程和主循环:

#-- CLIENT THREAD --

def client(conn):
    try:
        conn.send("Connected With Raspberry Pi")
        os.system(frameBufferCommand + openBlackImage)
    except socket.Error as msg:
        print(msg)

print(str(bindSuccess))

while 1:    
    dataReceived = conn.recv(1024)
    reply = "OK.. "
    conn.send(reply + dataReceived)
    dataList = splitString(dataReceived)
    print(dataList)
    if dataList[6] == "": 
        print("dataList[6] is empty, displaying a random poster")
        displayRandomPoster()
    else: 
        try:    
            moviePosterURL = dataList[6]            
            splitPosterURL = moviePosterURL.split("%")            
            moviePosterFilename = splitPosterURL[7]                
            urllib.urlretrieve(moviePosterURL, moviePosterLocation + moviePosterFilename)                
            conn.send("XBMC Movie Poster Downloading")
            conn.send("Movie Poster saved as: " + moviePosterLocation + moviePosterFilename)
            print("Movie Poster saved as: " + moviePosterLocation + moviePosterFilename)                            
        except socket.error:
            print("Encountered Socket Error While Downloading Poster - Line 80")            
        try:
            os.system(frameBufferCommand + moviePosterLocation + moviePosterFilename)
            print('Opening Downloaded Poster')
        except OSError as msg:
            print(str(msg[0]) + str(msg[1]))
    if not dataReceived:
        break
    time.sleep(1)


#-- MAIN FUNCTION --

host = ''
communicationPort = 5005

bindSuccess = False

crestronSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print("Socket Created Successfully")

try:
    crestronSocket.bind((host, communicationPort))
    bindSuccess = True
except socket.Error as msg: 
    bindSuccess = False
    print("Socket Bind Error" + msg)
    sys.exit()

crestronSocket.listen(1)
print("Crestron Socket Listening")

while bindSuccess == True:
    #wait to accept a connection - blocking call
    conn, addr = crestronSocket.accept()
    print('Connected with Client: ' + addr[0] + ':' + str(addr[1]))      
    thread.start_new_thread(client , (conn,))
crestronSocket.close()

每次循环时,我都在创建一个新的FBI流程,最后我耗尽了Pi的所有RAM,直到它停止,因为它没有任何剩余。我现在在加载图像后杀死FBI进程,修复了这个问题。谢谢大家的帮助


我还发现了一些其他因素,使它运行得更好/更无缝。

代码太多了。尝试将其精简为一个@LexScarisbrick。您的意思是为了调试吗?请阅读我其他评论中的链接。要点是人们需要筛选的代码越多,你得到答案的可能性就越小。“代码停止响应”-你的意思是你的服务器不接受新连接,还是现有连接停止工作?在ConnectionThread函数中,您应该将一些print语句放在它退出的地方并关闭连接,也许您的代码正在那里?否则,是的,太多的代码让任何人都无法轻易地了解细节。同样,过于特定于应用程序—如果有人能够自己运行代码,那么检查您的代码要容易得多,所以请将自己置于一个潜在的回答者的位置,一个没有您可用的图像/位的人。@barny现有连接停止响应。不过我想我可能已经弄明白了。我只是在看电视的时候运行脚本,我想我可能已经发现了问题所在。在displayRandomPoster()函数中,我遇到了一个IOError,因为它试图打开一个未正确保存的文件。我想这就是问题所在。但我不确定。