用python编写一个基于TCP/IP通信的服务器端,满足多用户连接,并能异常断开重连
时间: 2024-03-12 16:47:33 浏览: 21
好的,以下是一个简单的基于TCP/IP通信的服务器端代码,可以实现多用户连接,并能处理异常断开重连的情况。请注意,这只是一个示例代码,您需要根据具体情况进行修改和优化。
```python
import socket
import threading
# 定义服务器地址和端口
SERVER_ADDR = '127.0.0.1'
SERVER_PORT = 8888
# 定义一个字典,用于保存所有已连接的客户端socket
client_sockets = {}
# 定义一个函数,用于处理客户端连接请求
def handle_client(conn, addr):
# 向客户端发送欢迎消息
conn.send('Welcome to the server!'.encode())
# 将客户端socket添加到字典中
client_sockets[addr] = conn
# 循环接收客户端发来的消息
while True:
try:
data = conn.recv(1024).decode()
if not data:
break
print('Received from {}: {}'.format(addr, data))
# 将客户端发来的消息广播给所有已连接的客户端
for client_addr, client_conn in client_sockets.items():
if client_addr != addr:
client_conn.send('{}: {}'.format(addr, data).encode())
except:
# 发生异常时,先关闭客户端socket,再从字典中删除该客户端socket
conn.close()
del client_sockets[addr]
print('Client {} disconnected.'.format(addr))
break
# 创建服务器socket,绑定地址和端口,并开始监听
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((SERVER_ADDR, SERVER_PORT))
server_socket.listen(5)
print('Server started.')
# 循环接受客户端连接请求,并为每个客户端创建一个线程处理请求
while True:
conn, addr = server_socket.accept()
print('Client {} connected.'.format(addr))
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
```
在这个示例代码中,我们首先定义了服务器地址和端口,然后创建了一个字典client_sockets,用于保存所有已连接的客户端socket。接着我们定义了一个函数handle_client,用于处理客户端连接请求。在这个函数中,我们首先向客户端发送欢迎消息,然后将客户端socket添加到字典中,并循环接收客户端发来的消息。在接收到客户端消息后,我们将该消息广播给所有已连接的客户端。如果发生异常,我们先关闭客户端socket,再从字典中删除该客户端socket。最后我们创建了一个服务器socket,绑定地址和端口,并开始监听。在循环接受客户端连接请求的过程中,为每个客户端创建一个线程处理请求。
为了实现异常断开重连的功能,您需要在客户端程序中处理断开连接的情况,并在发生断开连接时自动重新连接服务器。