使用python写一个带心跳机制的socket通讯服务器
时间: 2024-03-15 12:45:37 浏览: 72
下面是一个使用Python写的带心跳机制的socket通讯服务器示例:
```python
import socket
import threading
import time
HOST = '127.0.0.1' # 服务器IP地址
PORT = 8888 # 服务器端口号
HEARTBEAT_INTERVAL = 10 # 心跳间隔时间,单位秒
# 客户端列表
clients = []
def heartbeat():
"""定时发送心跳包"""
while True:
for client in clients:
try:
client.send(b'heartbeat')
except Exception as e:
print(f'发送心跳包失败,错误信息:{e}')
clients.remove(client) # 删除失效的客户端
time.sleep(HEARTBEAT_INTERVAL)
def handle_client(client_socket, client_addr):
"""处理客户端连接"""
print(f'客户端 {client_addr} 已连接')
clients.append(client_socket)
while True:
try:
data = client_socket.recv(1024)
if not data:
break
print(f'收到客户端 {client_addr} 的消息:{data.decode()}')
except Exception as e:
print(f'客户端 {client_addr} 出现异常,错误信息:{e}')
break
# 关闭客户端连接
client_socket.close()
clients.remove(client_socket)
print(f'客户端 {client_addr} 已断开连接')
def start_server():
"""启动服务器"""
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen(5)
print(f'服务器已启动,监听 {HOST}:{PORT}')
# 启动心跳线程
threading.Thread(target=heartbeat).start()
while True:
client_socket, client_addr = server_socket.accept()
# 处理客户端连接
threading.Thread(target=handle_client, args=(client_socket, client_addr)).start()
if __name__ == '__main__':
start_server()
```
这个示例程序通过socket模块实现了一个简单的TCP服务器,每隔一定时间向所有客户端发送心跳包,以检测客户端是否在线。当客户端连接到服务器时,将客户端socket对象添加到客户端列表中,并启动一个新的线程来处理客户端连接。当客户端断开连接时,将客户端socket对象从客户端列表中删除。
阅读全文