def handleClient(self, conn, addr): trans = Transfer(conn) username = trans.recvData().decode() if username in self.clients: trans.send(b"in-use") return self.clients[username] = trans print(f"{username} has connected!") trans.send(b"success") while True: raw = trans.recvData() if not raw: break if raw == b"drop": break data = pickle.loads(raw) if data["type"] == "msg": msg = data["content"] date = datetime.datetime.now().strftime("%d-%m-%Y %H:%M") data = {"type": "msg", "sender": username, "date": date, "content": msg} self.sendAll(pickle.dumps(data)) print(f"{username} has disconnected.") del self.clients[username]
class Client: def __init__(self, addr, api, username): self.addr = addr self.api = api self.username = username self.connected = False def connect(self): self.s = socket.socket() self.s.settimeout(5) try: self.s.connect(self.addr) except socket.error: return "Server not found. Try again." self.trans = Transfer(self.s) self.trans.send(self.username.encode()) response = self.trans.recvData() if not response: return "Server not responding." if response == b"in-use": return "Username already in use." if response == b"success": self.s.settimeout(None) self.connected = True self.s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 5000, 3000)) threading.Thread(target=self.mainThread, daemon=True).start() return True def disconnect(self): self.trans.send(b"drop") self.connected = False def sendMessage(self, content): data = {"type": "msg", "content": content} self.trans.sendDataPickle(data) def mainThread(self): while self.connected: raw = self.trans.recvData() if not raw: break if raw == b"drop": self.api.disconnection("Server closed connection.") return data = pickle.loads(raw) if data["type"] == "msg": if data["sender"] == self.username: self.api.addMessage(data["content"], "true", data["date"], "Me") else: self.api.addMessage(data["content"], "false", data["date"], data["sender"]) else: return self.api.disconnection("Connection lost.")