Python使用 asyncio 实现 TCP/UDP Socket 编程
环境搭建和准备工作:
1. 首先,确保你已经安装了Python3版本。
2. 安装asyncio库,可以通过运行以下命令进行安装:
shell
pip install asyncio
依赖的类库:
1. asyncio:Python内置的异步IO库,用于处理异步编程。
2. socket:Python标准库,提供了底层的网络接口。
样例实现:
下面是一个使用asyncio实现TCP和UDP Socket编程的完整示例:
python
import asyncio
# TCP Socket示例
async def tcp_echo_client(message):
reader, writer = await asyncio.open_connection('localhost', 8888)
print(f'Send: {message!r}')
writer.write(message.encode())
data = await reader.read(100)
print(f'Received: {data.decode()!r}')
print('Close the connection')
writer.close()
await writer.wait_closed()
async def tcp_echo_server():
server = await asyncio.start_server(handle_echo, 'localhost', 8888)
addr = server.sockets[0].getsockname()
print(f'Serving on {addr}')
async with server:
await server.serve_forever()
async def handle_echo(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Received {message!r} from {addr!r}")
print(f"Send: {message!r}")
writer.write(data)
await writer.drain()
print("Close the connection")
writer.close()
# UDP Socket示例
async def udp_echo_client(message):
transport, protocol = await asyncio.get_event_loop().create_datagram_endpoint(
lambda: EchoClientProtocol(message),
remote_addr=('localhost', 8888))
await asyncio.sleep(0.1)
transport.close()
class EchoClientProtocol(asyncio.DatagramProtocol):
def __init__(self, message):
self.message = message
self.transport = None
def connection_made(self, transport):
self.transport = transport
self.transport.sendto(self.message.encode())
def datagram_received(self, data, addr):
print(f"Received {data.decode()} from {addr}")
def error_received(self, exc):
print('Error received:', exc)
def connection_lost(self, exc):
print("Connection closed")
async def udp_echo_server():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('localhost', 8888))
while True:
data, addr = await asyncio.get_event_loop().sock_recvfrom(sock, 100)
message = data.decode()
print(f"Received {message!r} from {addr!r}")
print(f"Send: {message!r}")
await asyncio.get_event_loop().sock_sendto(sock, data, addr)
# 启动TCP和UDP Server
async def main():
tcp_server = tcp_echo_server()
udp_server = udp_echo_server()
await asyncio.gather(tcp_server, udp_server)
asyncio.run(main())
总结:
以上是使用asyncio库实现TCP和UDP Socket编程的示例。asyncio提供了一种异步IO编程模型,使得在处理并发任务时更为简单和高效。在示例中,我们使用了asyncio库提供的函数和类来处理TCP和UDP Socket通信。 通过详细的代码示例,我们可以清楚地了解到如何使用asyncio进行异步编程来实现Socket通信。