一、
#在一台电脑上即可完成聊天
#这里是服务器
import socket import threading # 用于转发消息的函数 def handle_client(client_socket, client_address, clients): print(f"客户端 {client_address} 已连接") while True: try: # 接收客户端消息 message = client_socket.recv(1024).decode('utf-8') if not message: break # 如果没有消息,说明客户端断开连接 print(f"来自 {client_address} 的消息: {message}") # 将消息转发给所有已连接的客户端 for client in clients: if client != client_socket: try: client.send(f"来自 {client_address} 的消息: {message}".encode('utf-8')) except: continue except ConnectionResetError: break # 移除断开的客户端 clients.remove(client_socket) client_socket.close() print(f"客户端 {client_address} 已断开连接") # 启动服务器 def start_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('0.0.0.0', 9999)) # 绑定 IP 和端口 server_socket.listen(5) # 最大允许 5 个连接排队 print("服务器已启动,等待客户端连接...") # clients = [] # 存储所有连接的客户端 # while True: client_socket, client_address = server_socket.accept() # 接受客户端连接 clients.append(client_socket) client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address, clients)) client_thread.start() # 为每个客户端创建一个线程 if __name__ == "__main__": start_server()
二、
#搭建两个以上的客户端python文件:
import socket import threading # 接收消息的线程 def receive_messages(client_socket): while True: try: message = client_socket.recv(1024).decode('utf-8') print(message) except: break # 启动客户端 def start_client(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = '127.0.0.1' # 服务器 IP 地址 (本地测试使用) port = 9999 # 服务器端口 client_socket.connect((host, port)) # 连接到服务器 # 创建接收消息的线程 receive_thread = threading.Thread(target=receive_messages, args=(client_socket,)) receive_thread.start() print("连接到服务器,输入消息并按回车发送:") while True: message = input() # 用户输入消息 if message.lower() == 'exit': # 输入 'exit' 退出 break client_socket.send(message.encode('utf-8')) # 发送消息到服务器 client_socket.close() if __name__ == "__main__": start_client()
运行方式为:先运行server.py文件的代码,然后运行另外的两个client.py文件。两个client文件代码一样。
运行结果如下: