Python TCP服务器在一段时间后停止响应
问题描述:
因此,我在RPI上编写了这个python代码,以创建一个与我的crestron控制处理器进行对话的数字海报。出于某种原因,我的代码在一段时间后停止响应。我不知道为什么。
我不知道我的Pi是否会睡觉,但如果有人可以指出我的代码中可能导致此问题的任何信息,请让我知道。
Python TCP服务器在一段时间后停止响应
编辑:我找到了我自己。非常感谢所有评论过的人。
我每次经历循环时都创建了一个新的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内存,直到它停下来,因为它没有剩下任何东西。我现在杀死FBI过程后加载固定的图像。感谢大家的帮助。
我还想出了一些使其更好/更无缝地运行的其他功能。
太多的代码。尝试将其修剪为[MVCE](http://stackoverflow.com/help/mcve)。 –
@LexScarisbrick你的意思是为了调试目的? – ryanjblajda
请阅读我其他评论的链接。要点是人们需要筛选的代码越多,得到答案的可能性就越小。 –