12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- """
- python3 /home/server/repositories/repositories/sri-project.demo-py/3rdparty/xserver/xudp.py
- """
- import asyncio
- import struct
- # from concurrent.futures import ThreadPoolExecutor
- class CustomProtocol:
- clients = {}
- # executor = ThreadPoolExecutor()
- def connection_made(self, transport):
- self.transport = transport
- self.peername = None # UDP没有真正的连接,因此peername为空
- print(f"UDP Server started", flush=True)
- def datagram_received(self, data, addr):
- asyncio.create_task(self.handle_data(data, addr))
- def error_received(self, exc):
- print(f"Error received: {exc}", flush=True)
- async def handle_data(self, data, addr):
- if len(data) < 4:
- return # Ensure complete data packet is received
- loop = asyncio.get_running_loop()
- values = await loop.run_in_executor(None, self.process_data, data)
- # values = await loop.run_in_executor(CustomProtocol.executor, self.process_data, data)
- print(f"Received values: {values} from {addr}", flush=True)
- response = struct.pack('!hh', values[0] + 1, values[1] + 1)
- self.transport.sendto(response, addr)
- @staticmethod
- def process_data(data):
- values = struct.unpack('!hh', data)
- print(f"Processing data: {values}", flush=True)
- # Simulate some processing
- return (values[0] + 1, values[1] + 1)
- async def main():
- loop = asyncio.get_running_loop()
- transport, protocol = await loop.create_datagram_endpoint(
- lambda: CustomProtocol(),
- local_addr=('127.0.0.1', 20917)
- )
- print("UDP Server listening on 127.0.0.1:20917", flush=True)
- try:
- await asyncio.Future() # Keep running indefinitely
- finally:
- transport.close() # Close the transport
- if __name__ == "__main__":
- asyncio.run(main())
|