大作业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_())
复制代码

 

posted @   周+⑦  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示