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.
@@ -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
+ ]