TCP中服务器端server_socket = socket(AF_INET,SOCK_STREAM)
客户端:client.py
from socket import * from threading import Thread from tcp.client_handler import * def main(): client_socket = socket(AF_INET, SOCK_STREAM) client_socket.connect(('localhost', 8888)) user_name = input("用户名:") client_socket.send(user_name.encode("utf-8")) Thread(target=sendMsg, args=(client_socket,)).start() Thread(target=receiveMsg, args=(client_socket,)).start() if __name__ == '__main__': main()
客户端处理:client_handler.py
import json def sendMsg(client_socket): while True: input_msg = input().split("@") if len(input_msg) == 1: msg = input_msg[0] toPerson = "all" elif len(input_msg) == 2: msg = input_msg[0] toPerson = input_msg[1] else: print("注意格式,消息@对方用户名") data = {"msg": msg, "toPerson": toPerson} data = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '), ensure_ascii=True) client_socket.send(data.encode("utf-8")) def receiveMsg(client_socket): while True: msg = client_socket.recv(1024) print(msg.decode("utf-8"))
服务器端:server.py
from socket import * from threading import Thread from tcp.server_handler import * def main(): server_socket = socket(AF_INET, SOCK_STREAM) server_socket.bind(('localhost', 8888)) server_socket.listen(5) map = {} while True: try: client_socket, client_info = server_socket.accept() user_name = client_socket.recv(1024).decode("utf-8") print(user_name + "上线了。。。") map[user_name] = client_socket Thread(target=handler, args=(client_socket, map)).start() except Exception as e: print(e) if __name__ == '__main__': main()
服务器处理:server_handler.py
import json def handler(client_socket, map): user_name = findKey(client_socket, map) while True: try: data = client_socket.recv(1024) data = json.loads(data) msg = data["msg"] toPerson = data["toPerson"] if "all".endswith(toPerson): msg = user_name + ":" + msg for key in map.keys(): if user_name.endswith(key): continue map[key].send(msg.encode("utf-8")) else: msg = user_name + "对您私聊说:" + msg map[toPerson].send(msg.encode("utf-8")) except Exception as e: print(user_name+"下线了。。。") map.pop(user_name) client_socket.close() break def findKey(client_socket, map): key_list = [] value_list = [] for key, value in map.items(): key_list.append(key) value_list.append(value) if client_socket in value_list: value_index = value_list.index(client_socket) return key_list[value_index]
运行结果:(先运行服务器,再运行多个客户端)