litenetlib-0952 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- litenetlib/__init__.py +66 -0
- litenetlib/channels/__init__.py +16 -0
- litenetlib/channels/base_channel.py +115 -0
- litenetlib/channels/reliable_channel.py +451 -0
- litenetlib/channels/sequenced_channel.py +239 -0
- litenetlib/core/__init__.py +53 -0
- litenetlib/core/connection_request.py +240 -0
- litenetlib/core/constants.py +186 -0
- litenetlib/core/events.py +336 -0
- litenetlib/core/internal_packets.py +358 -0
- litenetlib/core/manager.py +355 -0
- litenetlib/core/packet.py +457 -0
- litenetlib/core/peer.py +334 -0
- litenetlib/utils/__init__.py +21 -0
- litenetlib/utils/data_reader.py +447 -0
- litenetlib/utils/data_writer.py +402 -0
- litenetlib/utils/fast_bit_converter.py +199 -0
- litenetlib/utils/net_utils.py +165 -0
- litenetlib_0952-1.0.0.dist-info/METADATA +448 -0
- litenetlib_0952-1.0.0.dist-info/RECORD +23 -0
- litenetlib_0952-1.0.0.dist-info/WHEEL +5 -0
- litenetlib_0952-1.0.0.dist-info/licenses/LICENSE +21 -0
- litenetlib_0952-1.0.0.dist-info/top_level.txt +1 -0
litenetlib/core/peer.py
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Network peer for LiteNetLib v0.9.5.2 / LiteNetLib v0.9.5.2 网络对等端
|
|
3
|
+
|
|
4
|
+
Represents a connected peer in the network.
|
|
5
|
+
表示网络中的已连接对等端。
|
|
6
|
+
|
|
7
|
+
Ported from: LiteNetLib/NetPeer.cs (v0.9.5.2)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
from typing import Optional, Tuple, Any, TYPE_CHECKING
|
|
12
|
+
from enum import IntFlag
|
|
13
|
+
from litenetlib.core.constants import (
|
|
14
|
+
NetConstants, PacketProperty, DeliveryMethod,
|
|
15
|
+
DisconnectReason
|
|
16
|
+
)
|
|
17
|
+
from litenetlib.core.packet import NetPacket
|
|
18
|
+
from litenetlib.core.internal_packets import (
|
|
19
|
+
NetConnectRequestPacket, NetConnectAcceptPacket,
|
|
20
|
+
serialize_address, deserialize_address
|
|
21
|
+
)
|
|
22
|
+
from litenetlib.utils.net_utils import NetUtils
|
|
23
|
+
from litenetlib.utils.data_writer import NetDataWriter
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from litenetlib.core.manager import LiteNetManager
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ConnectionState(IntFlag):
|
|
30
|
+
"""
|
|
31
|
+
Peer connection state / 对等端连接状态。
|
|
32
|
+
|
|
33
|
+
C# Reference: ConnectionState enum
|
|
34
|
+
"""
|
|
35
|
+
OUTGOING = 1 << 1
|
|
36
|
+
CONNECTED = 1 << 2
|
|
37
|
+
SHUTDOWN_REQUESTED = 1 << 3
|
|
38
|
+
DISCONNECTED = 1 << 4
|
|
39
|
+
ANY = OUTGOING | CONNECTED | SHUTDOWN_REQUESTED
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class NetPeer:
|
|
43
|
+
"""
|
|
44
|
+
Network peer class / 网络对等端类
|
|
45
|
+
|
|
46
|
+
Manages connection to a single remote peer.
|
|
47
|
+
管理到单个远程对等端的连接。
|
|
48
|
+
|
|
49
|
+
C# Reference: NetPeer
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
manager: 'LiteNetManager',
|
|
55
|
+
address: Tuple[str, int],
|
|
56
|
+
connection_number: int = 0
|
|
57
|
+
):
|
|
58
|
+
"""
|
|
59
|
+
Create network peer / 创建网络对等端。
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
manager: Network manager / 网络管理器
|
|
63
|
+
address: Remote address (host, port) / 远程地址
|
|
64
|
+
connection_number: Connection number (0-3) / 连接编号
|
|
65
|
+
"""
|
|
66
|
+
self._manager = manager
|
|
67
|
+
self._address = address
|
|
68
|
+
self._connection_number = connection_number
|
|
69
|
+
self._state = ConnectionState.OUTGOING
|
|
70
|
+
self._connect_time = 0
|
|
71
|
+
self._remote_id = 0
|
|
72
|
+
self._last_receive_time = NetUtils.get_time_millis()
|
|
73
|
+
|
|
74
|
+
# Channels / 通道
|
|
75
|
+
self._channels = {}
|
|
76
|
+
self._pending_packets = []
|
|
77
|
+
|
|
78
|
+
# Statistics / 统计
|
|
79
|
+
self._ping = 0
|
|
80
|
+
self._rtt = 0
|
|
81
|
+
self._packet_loss = 0.0
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def address(self) -> Tuple[str, int]:
|
|
85
|
+
"""Get peer address / 获取对等端地址"""
|
|
86
|
+
return self._address
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def connection_number(self) -> int:
|
|
90
|
+
"""Get connection number / 获取连接编号"""
|
|
91
|
+
return self._connection_number
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def state(self) -> ConnectionState:
|
|
95
|
+
"""Get connection state / 获取连接状态"""
|
|
96
|
+
return self._state
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def is_connected(self) -> bool:
|
|
100
|
+
"""Check if peer is connected / 检查对等端是否已连接"""
|
|
101
|
+
return self._state == ConnectionState.CONNECTED
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def ping(self) -> int:
|
|
105
|
+
"""Get current ping in milliseconds / 获取当前 ping(毫秒)"""
|
|
106
|
+
return self._ping
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def rtt(self) -> int:
|
|
110
|
+
"""Get round-trip time in milliseconds / 获取往返时间(毫秒)"""
|
|
111
|
+
return self._rtt
|
|
112
|
+
|
|
113
|
+
def send_connect_request(self, connection_data: bytes) -> None:
|
|
114
|
+
"""
|
|
115
|
+
Send connection request / 发送连接请求。
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
connection_data: Additional connection data / 额外连接数据
|
|
119
|
+
"""
|
|
120
|
+
self._connect_time = NetUtils.get_time_ticks()
|
|
121
|
+
|
|
122
|
+
# Serialize address / 序列化地址
|
|
123
|
+
host, port = self._address
|
|
124
|
+
address_bytes = serialize_address(host, port)
|
|
125
|
+
|
|
126
|
+
# Create connect request packet / 创建连接请求数据包
|
|
127
|
+
packet = NetConnectRequestPacket.make(
|
|
128
|
+
connect_data=connection_data,
|
|
129
|
+
address_bytes=address_bytes,
|
|
130
|
+
connect_id=self._connect_time
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
packet.connection_number = self._connection_number
|
|
134
|
+
|
|
135
|
+
# Send packet / 发送数据包
|
|
136
|
+
self._send_raw(packet)
|
|
137
|
+
|
|
138
|
+
async def accept_connection(self, request: NetConnectRequestPacket) -> None:
|
|
139
|
+
"""
|
|
140
|
+
Accept connection request / 接受连接请求。
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
request: Connection request / 连接请求
|
|
144
|
+
"""
|
|
145
|
+
self._connect_time = request.connection_time
|
|
146
|
+
self._connection_number = request.connection_number
|
|
147
|
+
|
|
148
|
+
# Send connect accept / 发送连接接受
|
|
149
|
+
packet = NetConnectAcceptPacket.make(
|
|
150
|
+
connect_id=self._connect_time,
|
|
151
|
+
connect_num=self._connection_number,
|
|
152
|
+
reused_peer=False
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
self._send_raw(packet)
|
|
156
|
+
|
|
157
|
+
# Update state / 更新状态
|
|
158
|
+
self._state = ConnectionState.CONNECTED
|
|
159
|
+
|
|
160
|
+
# Notify listener / 通知监听器
|
|
161
|
+
if self._manager.listener:
|
|
162
|
+
self._manager.listener.on_peer_connected(self)
|
|
163
|
+
|
|
164
|
+
async def handle_connect_accept(self, packet: NetPacket) -> None:
|
|
165
|
+
"""
|
|
166
|
+
Handle connection accept / 处理连接接受。
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
packet: Connect accept packet / 连接接受数据包
|
|
170
|
+
"""
|
|
171
|
+
accept = NetConnectAcceptPacket.from_data(packet)
|
|
172
|
+
if not accept:
|
|
173
|
+
return
|
|
174
|
+
|
|
175
|
+
self._connect_time = accept.connection_id
|
|
176
|
+
self._connection_number = accept.connection_number
|
|
177
|
+
|
|
178
|
+
# Update state / 更新状态
|
|
179
|
+
self._state = ConnectionState.CONNECTED
|
|
180
|
+
|
|
181
|
+
# Notify listener / 通知监听器
|
|
182
|
+
if self._manager.listener:
|
|
183
|
+
self._manager.listener.on_peer_connected(self)
|
|
184
|
+
|
|
185
|
+
def send(
|
|
186
|
+
self,
|
|
187
|
+
data: bytes,
|
|
188
|
+
delivery_method: Any = DeliveryMethod.RELIABLE_ORDERED
|
|
189
|
+
) -> None:
|
|
190
|
+
"""
|
|
191
|
+
Send data to peer / 向对等端发送数据。
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
data: Data to send / 要发送的数据
|
|
195
|
+
delivery_method: Delivery method / 传输方法
|
|
196
|
+
"""
|
|
197
|
+
if not self.is_connected:
|
|
198
|
+
return
|
|
199
|
+
|
|
200
|
+
# For now, use simple implementation / 现在使用简单实现
|
|
201
|
+
if delivery_method == DeliveryMethod.UNRELIABLE:
|
|
202
|
+
self._send_unreliable(data)
|
|
203
|
+
else:
|
|
204
|
+
self._send_reliable(data)
|
|
205
|
+
|
|
206
|
+
def _send_unreliable(self, data: bytes) -> None:
|
|
207
|
+
"""Send unreliable packet / 发送不可靠数据包"""
|
|
208
|
+
packet = NetPacket(PacketProperty.UNRELIABLE, len(data))
|
|
209
|
+
packet._data[packet.get_header_size():] = data
|
|
210
|
+
self._send_raw(packet)
|
|
211
|
+
|
|
212
|
+
def _send_reliable(self, data: bytes) -> None:
|
|
213
|
+
"""Send reliable packet / 发送可靠数据包"""
|
|
214
|
+
# For simplicity, use channeled packet / 为简单起见,使用通道数据包
|
|
215
|
+
packet = NetPacket(PacketProperty.CHANNELED, len(data))
|
|
216
|
+
packet._data[packet.get_header_size():] = data
|
|
217
|
+
self._send_raw(packet)
|
|
218
|
+
|
|
219
|
+
def _send_raw(self, packet: NetPacket) -> None:
|
|
220
|
+
"""
|
|
221
|
+
Send raw packet / 发送原始数据包。
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
packet: Packet to send / 要发送的数据包
|
|
225
|
+
"""
|
|
226
|
+
if self._manager._socket:
|
|
227
|
+
packet.connection_number = self._connection_number
|
|
228
|
+
try:
|
|
229
|
+
self._manager._socket.sendto(packet.get_bytes(), self._address)
|
|
230
|
+
except Exception as e:
|
|
231
|
+
print(f"Error sending packet: {e}")
|
|
232
|
+
|
|
233
|
+
async def handle_ack(self, packet: NetPacket) -> None:
|
|
234
|
+
"""
|
|
235
|
+
Handle ACK packet / 处理 ACK 数据包。
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
packet: ACK packet / ACK 数据包
|
|
239
|
+
"""
|
|
240
|
+
# TODO: Implement ACK handling / TODO: 实现 ACK 处理
|
|
241
|
+
pass
|
|
242
|
+
|
|
243
|
+
async def handle_data_packet(self, packet: NetPacket) -> None:
|
|
244
|
+
"""
|
|
245
|
+
Handle data packet / 处理数据数据包。
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
packet: Data packet / 数据数据包
|
|
249
|
+
"""
|
|
250
|
+
if not self.is_connected:
|
|
251
|
+
return
|
|
252
|
+
|
|
253
|
+
# Extract data / 提取数据
|
|
254
|
+
data = packet.get_data()
|
|
255
|
+
|
|
256
|
+
# Notify listener / 通知监听器
|
|
257
|
+
if self._manager.listener:
|
|
258
|
+
from litenetlib.utils.data_reader import NetDataReader
|
|
259
|
+
reader = NetDataReader(data)
|
|
260
|
+
self._manager.listener.on_network_receive(self, reader)
|
|
261
|
+
|
|
262
|
+
async def process_packet(self, packet: NetPacket) -> None:
|
|
263
|
+
"""
|
|
264
|
+
Process incoming packet / 处理传入数据包。
|
|
265
|
+
|
|
266
|
+
Args:
|
|
267
|
+
packet: Packet to process / 要处理的数据包
|
|
268
|
+
"""
|
|
269
|
+
prop = packet.packet_property
|
|
270
|
+
|
|
271
|
+
if prop == PacketProperty.PING:
|
|
272
|
+
await self._handle_ping(packet)
|
|
273
|
+
elif prop == PacketProperty.PONG:
|
|
274
|
+
await self._handle_pong(packet)
|
|
275
|
+
elif prop == PacketProperty.MTU_CHECK:
|
|
276
|
+
await self._handle_mtu_check(packet)
|
|
277
|
+
elif prop == PacketProperty.MTU_OK:
|
|
278
|
+
await self._handle_mtu_ok(packet)
|
|
279
|
+
|
|
280
|
+
async def _handle_ping(self, packet: NetPacket) -> None:
|
|
281
|
+
"""Handle ping packet / 处理 ping 数据包"""
|
|
282
|
+
# Send pong response / 发送 pong 响应
|
|
283
|
+
pong = NetPacket(PacketProperty.PONG, 10)
|
|
284
|
+
self._send_raw(pong)
|
|
285
|
+
|
|
286
|
+
async def _handle_pong(self, packet: NetPacket) -> None:
|
|
287
|
+
"""Handle pong packet / 处理 pong 数据包"""
|
|
288
|
+
# Calculate RTT / 计算 RTT
|
|
289
|
+
current_time = NetUtils.get_time_millis()
|
|
290
|
+
self._rtt = current_time - self._ping
|
|
291
|
+
self._ping = self._rtt // 2
|
|
292
|
+
|
|
293
|
+
async def _handle_mtu_check(self, packet: NetPacket) -> None:
|
|
294
|
+
"""Handle MTU check packet / 处理 MTU 检查数据包"""
|
|
295
|
+
# Send MTU OK response / 发送 MTU OK 响应
|
|
296
|
+
mtu_ok = NetPacket(PacketProperty.MTU_OK)
|
|
297
|
+
self._send_raw(mtu_ok)
|
|
298
|
+
|
|
299
|
+
async def _handle_mtu_ok(self, packet: NetPacket) -> None:
|
|
300
|
+
"""Handle MTU OK packet / 处理 MTU OK 数据包"""
|
|
301
|
+
# MTU discovery complete / MTU 发现完成
|
|
302
|
+
pass
|
|
303
|
+
|
|
304
|
+
async def update_async(self, current_time: int) -> None:
|
|
305
|
+
"""
|
|
306
|
+
Update peer state (async) / 更新对等端状态(异步)。
|
|
307
|
+
|
|
308
|
+
Args:
|
|
309
|
+
current_time: Current time in milliseconds / 当前时间(毫秒)
|
|
310
|
+
"""
|
|
311
|
+
# Check for timeout / 检查超时
|
|
312
|
+
if self.is_connected and current_time - self._last_receive_time > 30000: # 30 second timeout
|
|
313
|
+
self.shutdown()
|
|
314
|
+
if self._manager.listener:
|
|
315
|
+
self._manager.listener.on_peer_disconnect(self, DisconnectReason.TIMEOUT)
|
|
316
|
+
|
|
317
|
+
def disconnect(self) -> None:
|
|
318
|
+
"""Disconnect from peer / 断开与对等端的连接"""
|
|
319
|
+
if self._state == ConnectionState.DISCONNECTED:
|
|
320
|
+
return
|
|
321
|
+
|
|
322
|
+
# Send disconnect packet / 发送断开连接数据包
|
|
323
|
+
packet = NetPacket(PacketProperty.DISCONNECT, 8)
|
|
324
|
+
self._send_raw(packet)
|
|
325
|
+
|
|
326
|
+
self.shutdown()
|
|
327
|
+
|
|
328
|
+
def shutdown(self) -> None:
|
|
329
|
+
"""Shutdown peer connection / 关闭对等端连接"""
|
|
330
|
+
self._state = ConnectionState.DISCONNECTED
|
|
331
|
+
|
|
332
|
+
def __repr__(self) -> str:
|
|
333
|
+
"""String representation / 字符串表示"""
|
|
334
|
+
return f"NetPeer(address={self._address}, state={self._state.name})"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Utility modules for LiteNetLib Python v0.9.5.2.
|
|
3
|
+
|
|
4
|
+
工具模块 / Utility modules:
|
|
5
|
+
- data_reader: NetDataReader for reading binary data
|
|
6
|
+
- data_writer: NetDataWriter for writing binary data
|
|
7
|
+
- fast_bit_converter: Fast binary encoding/decoding
|
|
8
|
+
- net_utils: Network utility functions
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from .data_reader import NetDataReader
|
|
12
|
+
from .data_writer import NetDataWriter
|
|
13
|
+
from .fast_bit_converter import FastBitConverter
|
|
14
|
+
from .net_utils import NetUtils
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"NetDataReader",
|
|
18
|
+
"NetDataWriter",
|
|
19
|
+
"FastBitConverter",
|
|
20
|
+
"NetUtils",
|
|
21
|
+
]
|