import threading import os import sys from socket import * from PyQt5.Qt import * from datetime import datetime 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 # 检查是否是一个合理的host:port组合 addr, port = server_addr[:sp], server_addr[sp + 1:] try: port = int(port) except: QMessageBox.critical(self, "Error", "Invalid port") return # 检查port是否为整数 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(str(datetime.now()) + " " + msg) self.txtList.moveCursor(QTextCursor.End) # 呈现并将文本框滚到最后 if __name__ == "__main__": # 开启HiDPI支持 QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) app = QApplication(sys.argv) mw = MainWindow() mw.show() # 创建窗口并显示 app.exec() # 开始运行