提高稳定性
This commit is contained in:
parent
2aae52fb69
commit
1147ef5a89
@ -16,6 +16,7 @@ class ReliableChannel:
|
|||||||
self.remote_addr = remote_addr
|
self.remote_addr = remote_addr
|
||||||
self.send_buffer = deque()
|
self.send_buffer = deque()
|
||||||
self.recv_buffer = {}
|
self.recv_buffer = {}
|
||||||
|
self.recv_queue = deque() # 接收队列
|
||||||
self.expected_seq = 0
|
self.expected_seq = 0
|
||||||
self.last_ack = -1
|
self.last_ack = -1
|
||||||
self.ack_interval = 0.2
|
self.ack_interval = 0.2
|
||||||
@ -82,7 +83,11 @@ class ReliableChannel:
|
|||||||
while self.expected_seq in self.recv_buffer:
|
while self.expected_seq in self.recv_buffer:
|
||||||
data = self.recv_buffer.pop(self.expected_seq)
|
data = self.recv_buffer.pop(self.expected_seq)
|
||||||
self.expected_seq += 1
|
self.expected_seq += 1
|
||||||
# TODO: 返回数据或交给上层处理
|
self.recv_queue.append(data) # 添加到队列
|
||||||
|
|
||||||
|
def get_received_data(self):
|
||||||
|
"""从接收队列中取出数据"""
|
||||||
|
return self.recv_queue.popleft() if self.recv_queue else None
|
||||||
|
|
||||||
def send_ack(self):
|
def send_ack(self):
|
||||||
ack_packet = {
|
ack_packet = {
|
||||||
@ -227,6 +232,8 @@ class ServiceConnector:
|
|||||||
args=(conn_id, channel),
|
args=(conn_id, channel),
|
||||||
daemon=True
|
daemon=True
|
||||||
).start()
|
).start()
|
||||||
|
|
||||||
|
|
||||||
elif action == 'data':
|
elif action == 'data':
|
||||||
# 处理数据包
|
# 处理数据包
|
||||||
conn_id = message.get('conn_id')
|
conn_id = message.get('conn_id')
|
||||||
@ -288,11 +295,28 @@ class ServiceConnector:
|
|||||||
args=(conn_id, client_sock),
|
args=(conn_id, client_sock),
|
||||||
daemon=True
|
daemon=True
|
||||||
).start()
|
).start()
|
||||||
|
|
||||||
|
threading.Thread(
|
||||||
|
target=self.forward_incoming_data,
|
||||||
|
args=(conn_id, client_sock),
|
||||||
|
daemon=True
|
||||||
|
).start()
|
||||||
|
|
||||||
except socket.timeout:
|
except socket.timeout:
|
||||||
pass
|
pass
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"TCP监听错误: {str(e)}")
|
print(f"TCP监听错误: {str(e)}")
|
||||||
|
|
||||||
|
def forward_incoming_data(self, conn_id, local_sock):
|
||||||
|
while conn_id in self.active_connections:
|
||||||
|
if conn_id in self.reliable_channels:
|
||||||
|
channel = self.reliable_channels[conn_id]
|
||||||
|
data = channel.get_received_data()
|
||||||
|
if data:
|
||||||
|
local_sock.sendall(data)
|
||||||
|
else:
|
||||||
|
time.sleep(0.1)
|
||||||
|
|
||||||
def forward_data(self, conn_id, client_sock):
|
def forward_data(self, conn_id, client_sock):
|
||||||
"""转发本地TCP数据到UDP通道"""
|
"""转发本地TCP数据到UDP通道"""
|
||||||
try:
|
try:
|
||||||
|
|||||||
21
provider1.py
21
provider1.py
@ -14,6 +14,7 @@ class ReliableChannel:
|
|||||||
self.remote_addr = remote_addr
|
self.remote_addr = remote_addr
|
||||||
self.send_buffer = deque() # 发送缓冲区
|
self.send_buffer = deque() # 发送缓冲区
|
||||||
self.recv_buffer = {} # 接收缓冲区 (seq -> data)
|
self.recv_buffer = {} # 接收缓冲区 (seq -> data)
|
||||||
|
self.recv_queue = deque() # 接收队列
|
||||||
self.expected_seq = 0 # 期望的下一个序列号
|
self.expected_seq = 0 # 期望的下一个序列号
|
||||||
self.last_ack = -1 # 最后确认的序列号
|
self.last_ack = -1 # 最后确认的序列号
|
||||||
self.ack_interval = 0.2 # ACK发送间隔 (秒)
|
self.ack_interval = 0.2 # ACK发送间隔 (秒)
|
||||||
@ -98,7 +99,11 @@ class ReliableChannel:
|
|||||||
while self.expected_seq in self.recv_buffer:
|
while self.expected_seq in self.recv_buffer:
|
||||||
data = self.recv_buffer.pop(self.expected_seq)
|
data = self.recv_buffer.pop(self.expected_seq)
|
||||||
self.expected_seq += 1
|
self.expected_seq += 1
|
||||||
# TODO: 返回数据或交给上层处理
|
self.recv_queue.append(data) # 添加到队列
|
||||||
|
|
||||||
|
def get_received_data(self):
|
||||||
|
"""从接收队列中取出数据"""
|
||||||
|
return self.recv_queue.popleft() if self.recv_queue else None
|
||||||
|
|
||||||
def send_ack(self):
|
def send_ack(self):
|
||||||
"""发送ACK确认"""
|
"""发送ACK确认"""
|
||||||
@ -268,6 +273,12 @@ class ServiceProvider:
|
|||||||
daemon=True
|
daemon=True
|
||||||
).start()
|
).start()
|
||||||
|
|
||||||
|
threading.Thread(
|
||||||
|
target=self.forward_incoming_data,
|
||||||
|
args=(conn_id, channel, local_sock),
|
||||||
|
daemon=True
|
||||||
|
).start()
|
||||||
|
|
||||||
threading.Thread(
|
threading.Thread(
|
||||||
target=self.monitor_channel,
|
target=self.monitor_channel,
|
||||||
args=(conn_id, channel),
|
args=(conn_id, channel),
|
||||||
@ -283,6 +294,14 @@ class ServiceProvider:
|
|||||||
'message': str(e)
|
'message': str(e)
|
||||||
}).encode(), client_addr)
|
}).encode(), client_addr)
|
||||||
|
|
||||||
|
def forward_incoming_data(self, conn_id, channel, local_sock):
|
||||||
|
while conn_id in self.active_connections:
|
||||||
|
data = channel.get_received_data()
|
||||||
|
if data:
|
||||||
|
local_sock.sendall(data)
|
||||||
|
else:
|
||||||
|
time.sleep(0.02)
|
||||||
|
|
||||||
def forward_data(self, conn_id, local_sock, channel):
|
def forward_data(self, conn_id, local_sock, channel):
|
||||||
"""转发TCP数据到UDP通道"""
|
"""转发TCP数据到UDP通道"""
|
||||||
try:
|
try:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user