我在python中编写了一个脚本,用于侦听TCP端口并从远程设备接收数据并将其保存在数据库中,并且我还使用respawn在后台运行此脚本并持续运行,但是当远程设备连接到TCP端口时第一次,脚本获取数据并正确地将它们保存在数据库中,但是一段时间后远程设备从端口断开并再次连接到端口,在此之后,脚本不会将数据保存在数据库中,远程设备如何连接没有问题的端口。 这是python代码:
from socket import *
import MySQLdb
TCP_IP = '*.*.*.*'
TCP_PORT = 5005
BUFFER_SIZE = 1024
db = MySQLdb.connect("localhost","***","****","***" )
sock=socket()
sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 100)
sock.bind((TCP_IP, TCP_PORT))
sock.listen(10)
conn, addr = sock.accept()
print 'Connection address:', addr
try:
while True:
data = conn.recv(BUFFER_SIZE)
cursor = db.cursor()
sql = "INSERT INTO data(DATA) VALUES ('%s')" % (data)
cursor.execute(sql)
db.commit()
if not data: break
print "received data:", data
conn.send(data)
conn.close()
db.close()
except:
db.rollback()
问题是什么?
答案 0 :(得分:1)
你需要搬家
conn, addr = sock.accept()
print 'Connection address:', addr
进入while循环,因此服务器可以连续接受客户端 别忘了搬家
conn.close()
进入while循环,因此可以正确释放资源
答案 1 :(得分:1)
因为你的代码没有循环(我的意思不是你的读数据循环)。当sock.accept()返回时,代码将运行到try块,并且永远不会返回。当连接关闭时,这将停止。我认为您可以在代码中添加而Ture 来包装sock.accept()并读取数据循环。
就像:
while True:
conn, addr = sock.accept()
try:
while True:
read data
save into db
if not data: break
except:
....
finally:
conn.close()