添加缓存机制

This commit is contained in:
murmur 2023-03-11 11:51:56 +08:00
parent 4653f77083
commit 211b879a75

View File

@ -2,15 +2,39 @@
#coding:utf-8
import socketserver
import subprocess
import pickle
offs = 0 #偏移量
p ={}
#保存终端信息ccid与地址对
#p={ccid=addr,}
#缓存未能正常发送消息的客户端
pp={}
cache=[]
# cache={}
from collections import defaultdict
cache=defaultdict(list)
def save_cache(dic):
'''缓存未发送成功的消息'''
# f=open("./cache.txt",mode='w+')
# f.write(str(dic))
# f.close
pickle.dump(dic,open("./cache.txt",'wb'))
def load_cache():
try:
# f=open("./cache.txt")
# c = eval(f.read())
# f.close()
c=pickle.load(open("./cache.txt",'rb'))
return c
except:
return None
def update_pairs(addr,ccid,clear=0):
'''更新终端库
addr:绑定tcp地址
@ -59,13 +83,25 @@ def get_ccid(addr):
+--------+--------------+----------+----------+--------------+------------------------+--------+
'''
def send(fd,data):
try:
fd.send(data)
return 0
except:
return -1
def tt_hh(addr,data):
'''处理心跳'''
# 更新pairs
update_pairs(addr,data[7+offs:11+offs])
ccid = data[7+offs:11+offs]
update_pairs(addr,ccid)
# 组帧再返回
# 从缓存中匹配数据并重发
if ccid in cache:
for i in cache[ccid]:
addr.send(i)
return 0
@ -74,27 +110,37 @@ def tt_trans(addr,data):
tccid = data[7+offs:11+offs]
taddr = get_addr(tccid)
if not taddr:
print("未找到在线终端可能终端未在线或ccid错。")
return 0
print("找到匹配终端:",tccid,"<--->",taddr)
# 组帧
msg = bytearray(data[:])
msg[:5]=b'$TMMX'
msg[:5]=b'$TTMX'
msg[7+offs:11+offs] = get_ccid(addr)
# 计算校验和
crc = 0
for i in msg[:-2]:
for i in msg[:-1]:
crc = crc ^ i
msg[-1]=crc
if not taddr:
#更新缓存
#{tccid1=[msg1,msg2,...],...}
cache[tccid].append(msg)
save_cache(cache)
print("未找到在线终端可能终端未在线或ccid错。")
return 0
print("找到匹配终端:",tccid,"<--->",taddr)
# 发送
try:
taddr.send(msg)
except Exception:
# 更新pairs
# 更新pairs,清空对应终端
update_pairs(taddr,tccid,1)
#更新缓存
#{tccid1=[msg1,msg2,...],...}
cache[tccid].append(msg)
save_cache(cache)
print("终端已掉线。",taddr)
return 0
@ -114,7 +160,7 @@ def tt_decode(addr,data):
'''处理收到的数据'''
if data[:5].hex() != "2454544d53" or len(data) <12:
if data[:5] != b'$TTMS' or len(data) <12:
# 数据长度不可能小于12考虑非法接入的可能主动断开连接
return -1
@ -151,8 +197,13 @@ class MyServer(socketserver.BaseRequestHandler):
if __name__ == '__main__':
# load_cache
cache = load_cache()
server = socketserver.ThreadingTCPServer(('localhost',8005), MyServer)
ip, port = server.server_address
print ("服务端已建立:",ip, port)
server.serve_forever()