080. 编写一个函数,实现简单的的网络服务器功能
在 Python 中,可以使用 socket
模块来实现一个简单的网络服务器。以下是一个示例代码,展示如何创建一个简单的 TCP 服务器,该服务器可以接收客户端的连接并处理请求。
示例代码
以下代码实现了一个简单的 TCP 服务器,服务器会接收客户端发送的消息并回复一个简单的响应。
import socket
def simple_tcp_server(host='127.0.0.1', port=65432):
"""
简单的 TCP 服务器
:param host: 服务器地址,默认为 localhost
:param port: 服务器端口,默认为 65432
"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen()
print(f"服务器启动,监听地址 {host}:{port}")
while True:
conn, addr = s.accept()
with conn:
print(f"连接来自 {addr}")
while True:
data = conn.recv(1024)
if not data:
break
print(f"收到消息:{data.decode('utf-8')}")
conn.sendall(b"服务器已收到你的消息: " + data)
# 示例用法
if __name__ == "__main__":
simple_tcp_server()
代码说明
创建套接字:
-
使用
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
创建一个 TCP 套接字。 -
socket.AF_INET
表示使用 IPv4 地址,socket.SOCK_STREAM
表示使用 TCP 协议。
绑定地址和端口:使用 s.bind((host, port))
将套接字绑定到指定的地址和端口。
监听连接:使用 s.listen()
开始监听连接请求。
接受连接:使用 s.accept()
接受客户端的连接。该方法返回一个元组 (conn, addr)
,其中 conn
是客户端的套接字对象,addr
是客户端的地址。
接收和发送数据:
-
使用
conn.recv(1024)
接收客户端发送的数据。 -
使用
conn.sendall()
向客户端发送响应。
关闭连接:
-
使用
conn.close()
关闭客户端连接。 -
使用
s.close()
关闭服务器套接字。
示例输出
假设运行上述代码,服务器将启动并监听指定的地址和端口。当客户端连接并发送消息时,服务器将打印收到的消息并回复客户端。
注意事项
- 多线程或异步处理:如果需要同时处理多个客户端连接,可以使用多线程或异步 I/O。例如,可以使用
threading
模块为每个客户端创建一个线程。 - 错误处理:在实际应用中,建议添加异常处理机制,以处理网络错误、客户端断开连接等情况。
- 安全性:确保服务器不会处理恶意数据。在处理客户端数据时,进行适当的验证和清理。
- 停止服务器:在实际应用中,可以设置一个条件变量或信号处理机制,以便在需要时停止服务器。
扩展功能
多线程服务器:
import threading
def handle_client(conn, addr):
with conn:
print(f"连接来自 {addr}")
while True:
data = conn.recv(1024)
if not data:
break
print(f"收到消息:{data.decode('utf-8')}")
conn.sendall(b"服务器已收到你的消息: " + data)
def simple_tcp_server_multithread(host='127.0.0.1', port=65432):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen()
print(f"服务器启动,监听地址 {host}:{port}")
while True:
conn, addr = s.accept()
client_thread = threading.Thread(target=handle_client, args=(conn, addr))
client_thread.start()
if __name__ == "__main__":
simple_tcp_server_multithread()
异步服务器:使用 asyncio
和 asyncio.streams
模块实现异步服务器。
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)