[Python] 纯文本查看 复制代码 import socket
import threading
# 服务器配置
HOST = '0.0.0.0' # 允许所有网络接口连接
PORT = 12345 # 端口号
# 存储所有连接的客户端
clients = []
nicknames = []
def broadcast(message, client_socket):
"""向所有连接的客户端广播消息,除了发送者"""
for client in clients:
if client != client_socket:
try:
client.send(message)
except:
# 如果发送失败,移除该客户端
remove_client(client)
def remove_client(client_socket):
"""移除客户端连接"""
if client_socket in clients:
index = clients.index(client_socket)
clients.remove(client_socket)
nickname = nicknames[index]
nicknames.remove(nickname)
broadcast(f'{nickname} 离开了聊天室!'.encode('utf-8'), client_socket)
def handle_client(client_socket):
"""处理单个客户端连接"""
# 接收客户端的昵称
nickname = client_socket.recv(1024).decode('utf-8')
nicknames.append(nickname)
clients.append(client_socket)
print(f'新连接: {nickname}')
broadcast(f'{nickname} 加入了聊天室!'.encode('utf-8'), client_socket)
# 持续接收客户端消息
while True:
try:
message = client_socket.recv(4096) # 4096字节缓冲区,支持较长消息
if message:
broadcast(message, client_socket)
else:
remove_client(client_socket)
break
except:
remove_client(client_socket)
break
def start_server():
"""启动服务器"""
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen()
print(f'服务器已启动,监听 {HOST}:{PORT}...')
try:
while True:
client_socket, client_address = server_socket.accept()
print(f'接受来自 {str(client_address)} 的连接')
# 启动新线程处理客户端
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
except KeyboardInterrupt:
print("\n服务器正在关闭...")
server_socket.close()
if __name__ == "__main__":
start_server()
|