Python脚本在第一次连接后不从端口获取数据

Python脚本在第一次连接后不从端口获取数据,python,database,python-2.7,tcp,port,Python,Database,Python 2.7,Tcp,Port,我用python编写了一个脚本,用于侦听TCP端口并从远程设备接收数据,并将其保存在数据库中,我还使用respawn在后台连续运行此脚本,但当远程设备第一次连接到TCP端口时,该脚本获取数据并将其正确保存在数据库中,但过了一段时间,远程设备从端口断开连接并再次连接到端口,在这段时间之后,脚本不会将数据保存在数据库中,远程设备如何连接到端口都没有问题。 这是python代码: from socket import * import MySQLdb TCP_IP = '*.*.*.*' TCP_PO

我用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()
有什么问题吗?

您需要移动

conn, addr = sock.accept()
print 'Connection address:', addr
进入while循环,这样服务器就可以继续接受客户端 别忘了搬家

conn.close()
进入while循环,以便正确释放资源

您需要移动

conn, addr = sock.accept()
print 'Connection address:', addr
进入while循环,这样服务器就可以继续接受客户端 别忘了搬家

conn.close()

进入while循环,这样就可以正确地释放资源,因为您的代码没有循环(我的意思不是读取数据循环)。当sock.accept()返回时,代码将运行到try块中,并且永远不会返回。当连接关闭时,这将停止。我认为您可以在代码中添加一个while-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()

因为您的代码没有循环(我的意思不是读取数据循环)。当sock.accept()返回时,代码将运行到try块中,并且永远不会返回。当连接关闭时,这将停止。我认为您可以在代码中添加一个while-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()

外部也需要一个循环,我认为读取数据循环是必要的。你是什么意思?我有一个循环,当为true时,您的循环是当连接建立时,您读取循环中的传入数据。但是您应该注意,当连接关闭时,您的代码无法再次接受。因为你的代码一直运行到最后。您应该添加一个循环来一次又一次地接受连接。当然,只有第一个连接是闭合的,第二个可以在代码中接受。外部也需要一个循环,我认为读取数据循环是必要的。你是什么意思?我有一个循环,当为true时,您的循环是当连接建立时,您读取循环中的传入数据。但是您应该注意,当连接关闭时,您的代码无法再次接受。因为你的代码一直运行到最后。您应该添加一个循环来一次又一次地接受连接。当然,只有第一个连接是关闭的,第二个可以在您的代码中接受。远程设备每秒发送数据,我认为每次远程设备打开时,最好打开一个连接并通过该连接连续发送数据,直到连接因任何原因关闭,然后再次打开新连接,但您的想法意味着远程设备每秒打开一个连接发送数据并关闭连接,然后在1秒后再次。。。。,在第一种情况下我必须做什么?远程设备每秒发送数据,我认为每次远程设备打开时最好打开一个连接并通过该连接连续发送数据,直到连接因任何原因关闭,然后再次打开新连接,但您的想法意味着远程设备每秒打开一个连接发送数据并关闭连接,然后在1秒后再次关闭连接….,在第一种情况下我必须做什么?