import threading import os import sys from socket import * from PyQt5.Qt import * from main_window_ui import Ui_MainWindow class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super(MainWindow, self).__init__() self.setupUi(self) self.btnSend.clicked.connect(self.btnSend_onclicked) self.btnConnect.clicked.connect(self.btnConnect_onclicked) self.statusbar.showMessage("Disconnected") self.socket: socket = None self.isConnected = False def closeEvent(self, event): if self.isConnected: self.btnConnect.click() self.close() def btnConnect_onclicked(self): if not self.isConnected: server_addr = self.txtServerInput.text() sp = server_addr.rfind(':') if sp in [-1, 0, len(server_addr) - 1]: QMessageBox.critical(self, "Error", "Invalid address") return addr, port = server_addr[:sp], server_addr[sp + 1:] try: port = int(port) except: QMessageBox.critical(self, "Error", "Invalid port") return try: self.socket = socket(AF_INET, SOCK_STREAM) self.socket.connect((addr, port)) except: QMessageBox.critical(self, "Error", "Connect failed") return self.btnConnect.setText('Disconnect') self.statusbar.showMessage("Connected") self.isConnected = True threading.Thread(target=self.recvmsg_loop).start() else: self.socket.close() self.btnConnect.setText('Connect') self.statusbar.showMessage("Disonnected") self.isConnected = False def btnSend_onclicked(self): msg = ':'.join([self.txtIDInput.text(), self.txtNewMsg.toPlainText()]) self.txtNewMsg.clear() self.socket.send(msg.encode()) def recvmsg_loop(self): while True: if not self.isConnected: return msg = self.socket.recv(1 << 20).decode() print(msg) sp1 = msg.find(':') sp2 = msg.find(':', sp1 + 1) msg = "{}@{}:\n{}".format(msg[sp1 + 1:sp2], msg[:sp1], msg[sp2 + 1:]) self.txtList.append(msg) self.txtList.moveCursor(QTextCursor.End) if __name__ == "__main__": QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) app = QApplication(sys.argv) mw = MainWindow() mw.show() app.exec()