写了一个将接收到的数据插入数据库的python脚本,平常获取,插入数据正常,但是现在发现运行了1天或者几天之后会报错,报错之后无法插入新数据,以下是源码
# 引入socket模块
import socket
# 引入线程模块
import threading
# 引入mssql模块
import pymssql
from pymssql import _mssql
from pymssql import _pymssql
import uuid
import decimal
# 引入正则表达式模块
import re
# 引入日期时间模块
import datetime
import time
from multiprocessing import Lock
# 创建socket服务
class TCPServer(threading.Thread):
"""tcp服务器"""
def __init__(self, ip, port, conn, cursor):
super().__init__()
self.conn = conn
self.cursor = cursor
# 1、创建socket对象
self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、设置端口地址复用
self.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3、绑定地址端口
self.tcp_server.bind((ip, port))
# 4、设置被动
self.tcp_server.listen(128)
self.__lock = Lock()
def run(self):
while True:
self.__lock.acquire()
# 1、获取客户端发来的连接请求 得到客户端对象和地址
client, addr = self.tcp_server.accept()
# 2、开启一个线程 处理当前收到的客户端对象
HandleClient(client, addr, self.conn, self.cursor).start()
self.__lock.release()
time.sleep(0.1)
def __del__(self):
print('服务器结束')
self.tcp_server.close()
# 接收并处理客户端数据
class HandleClient(threading.Thread):
def __init__(self, client, addr, conn, cursor):
super().__init__()
self.client = client
self.addr = addr
self.conn = conn
self.cursor = cursor
def run(self):
while True:
# 1、接收信息
data1 = self.client.recv(1024)
# 2、解码
data2 = data1.decode('gbk')
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(now, '收到来自%s的信息%s' % (self.addr, data2))
if not data2:
break
# 3、自动回复 把原数据返回
self.client.send(data1)
# 4、字符串数据提取
hextodec = lambda s:int(s,16)
tuple_1 = [t(s) for t,s in zip((int,str,str,str,str,float,str,float,float,float,int,float,float,float,hextodec),re.search('^\$(\d+),(\w+),(\d{4}-\d{2}-\d{2}),(\d{2}:\d{2}:[\d.]+),(\w+),([-?\d.]+),(\w+),([-?\d.]+),([-?\d.]+),([-?\d.]+),(-?\d+),([-?\d.]+),([-?\d.]+),([-?\d.]+)\*([0-9a-fA-F]+)\r\n$',data2).groups())]
tuple_2 = tuple(tuple_1)
print('Extracting data is ok!')
# 5、计算理论校验值
checksum = 0
for i in data2:
if i == '*':
break;
if i != '$':
checksum = checksum ^ ord(i)
# 6、比较理论校验值和实际校验值
if checksum == tuple_1[len(tuple_1) - 1]:
print('Checksum is ok!')
# 4、往数据库表中插入数据
self.cursor.executemany("INSERT INTO GpsInfo VALUES (%d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %d)", [tuple_2])
# 如果连接时没有设置autocommit为True的话,必须主动调用commit() 来保存更改。
#self.conn.commit()
print('Insering data is ok!')
time.sleep(0.1)
def __del__(self):
print('客户服务结束')
self.client.close()
if __name__ == '__main__':
# sql服务器名称
serverName = '127.0.0.1:1433'
# 登陆用户名和密码
userName = 'sa'
passWord = '*****'
# 数据库名称
dbName = '*****'
# tcp通信地址
socketIp = '******'
# tcp通信端口
socketPort = ****
# 1、建立连接并获取cursor
print('Start to connect server...')
conn = pymssql.connect(serverName , userName , passWord, dbName,autocommit=True)
cursor = conn.cursor()
print('Connecting server is ok!\r\n')
# 2、创建socket服务并等待客户端建立tcp连接
tcp_server = TCPServer(socketIp, socketPort, conn, cursor)
tcp_server.start()
下图是长时间运行后的报错信息
求怎么修改代码可以避免出现问题,谢谢啦
数据库端口没有开