大作业2
服务端client.py
import sys import socket import threading from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * class ChatClient(QWidget): def __init__(self): super().__init__() self.username = None self.socket = None self.message_history = [] self.init_ui() self.show_login_dialog() def init_ui(self): self.username_label = QLabel("Username:") self.username_line_edit = QLineEdit() self.ip_label = QLabel("Server IP:") self.ip_line_edit = QLineEdit("localhost") self.port_label = QLabel("Server Port:") self.port_line_edit = QLineEdit("8000") self.login_button = QPushButton("Login") self.login_button.clicked.connect(self.login) self.message_list_widget = QListWidget() self.message_line_edit = QLineEdit() self.message_line_edit.returnPressed.connect(self.send_message) layout = QGridLayout() layout.addWidget(self.username_label, 0, 0) layout.addWidget(self.username_line_edit, 0, 1) layout.addWidget(self.ip_label, 1, 0) layout.addWidget(self.ip_line_edit, 1, 1) layout.addWidget(self.port_label, 2, 0) layout.addWidget(self.port_line_edit, 2, 1) layout.addWidget(self.login_button, 3, 1) layout.addWidget(self.message_list_widget, 4, 0, 1, 2) layout.addWidget(self.message_line_edit, 5, 0, 1, 2) self.setLayout(layout) def show_login_dialog(self): dialog = QDialog() dialog.setWindowTitle("Login") dialog.setWindowModality(Qt.ApplicationModal) username_label = QLabel("Username:") username_line_edit = QLineEdit() login_button = QPushButton("Login") login_button.clicked.connect(dialog.accept) layout = QVBoxLayout() layout.addWidget(username_label) layout.addWidget(username_line_edit) layout.addWidget(login_button) dialog.setLayout(layout) if dialog.exec_() == QDialog.Accepted and len(username_line_edit.text().strip()) > 0: self.username = username_line_edit.text().strip() self.username_line_edit.setText(self.username) def login(self): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((self.ip_line_edit.text(), int(self.port_line_edit.text()))) self.socket.send(self.username.encode()) threading.Thread(target=self.receive_messages).start() self.username_line_edit.setDisabled(True) self.ip_line_edit.setDisabled(True) self.port_line_edit.setDisabled(True) self.login_button.setDisabled(True) def receive_messages(self): while True: message = self.socket.recv(1024).decode() self.message_history.append(message) self.message_list_widget.addItem(message) def send_message(self): message = self.message_line_edit.text().strip() if len(message) > 0: self.socket.send(message.encode()) self.message_line_edit.setText("") def closeEvent(self, event): if self.socket is not None: self.socket.close() if __name__ == '__main__': app = QApplication(sys.argv) client = ChatClient() client.show() sys.exit(app.exec_())
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南