首次连接后,Python脚本不会从端口获取数据

时间:2017-08-05 13:32:33

标签: python database python-2.7 tcp port

我在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()

问题是什么?

2 个答案:

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