用协程实现tcpsocket
时间: 2023-05-28 14:02:29 浏览: 64
协程在Python中是非常方便的,可以让我们很容易地实现一些高效的网络编程,下面是一个简单的示例,用协程实现TCP套接字:
```python
import socket
import asyncio
async def handle_client(connection, address):
print(f"New client {address[0]}:{address[1]}")
while True:
data = await connection.recv(1024)
if not data:
print(f"Client {address[0]}:{address[1]} disconnected")
break
print(f"Received data from {address[0]}:{address[1]}: {data.decode()}")
await connection.sendall(data)
connection.close()
async def run_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('localhost', 8888))
server_socket.listen(5)
print("Server listening on localhost:8888")
while True:
connection, address = await asyncio.get_event_loop().sock_accept(server_socket)
asyncio.create_task(handle_client(connection, address))
asyncio.run(run_server())
```
在此示例中,我们使用了Python的内置协程框架asyncio,我们定义了一个async函数handle_client来处理每个客户端连接的数据,并定义一个run_server函数来启动我们的服务器。
在handle_client中,我们首先打印出新的客户端连接地址,然后在一个while循环中,我们使用await关键字接收客户端发来的数据,如果客户端关闭了连接,我们会关闭它的连接并退出循环。否则,我们打印接收到的数据并使用await将其发送回客户端。
在run_server函数中,我们创建了一个socket对象并绑定它到本地主机的8888端口,并开始监听连接。在一个while循环中,我们使用await将服务器套接字的接收方法包装在一个异步任务中,并在处理每个新客户端连接时创建一个新的异步任务来调用handle_client函数。
最后,我们使用Python的asyncio模块的run函数来运行我们的服务器。这将运行一个单独的事件循环来处理所有的协程任务,并在所有的任务完成之后退出。