Python 实现聊天室Pyqt5 socket thread

   1.服务器端代码

  

import socket
from threading import Thread
import time


class ServerChat:
    def __init__(self):
        self.server = socket.socket()
        self.server.bind(('localhost', 9999))
        self.server.listen(5)
        # 所有客户端的socket
        self.clients = []
        # 所有客户端的名字
        self.clients_name_ip = {}

    # 监听客户端连接
    def get_conn(self):
        while True:
            # 获取客户端连接
            client, address = self.server.accept()
            self.clients.append(client)
            print('连接地址:', address)
            data = "欢迎来到聊天室,请输入你的名字:"
            client.send(data.encode('utf-8'))
            # 创建一个线程,监听客户端消息
            thread = Thread(target=self.get_msg, args=(client, self.clients, self.clients_name_ip, address))
            thread.start()

    # 监听客户端消息
    def get_msg(self, client, clients, client_name_ip, address):
        # 获取客户端的名字
        name = client.recv(1024).decode('utf-8')
        print(name + "加入聊天室")
        # 将客户端的名字和ip地址保存到字典中
        client_name_ip[address] = name
        data = "欢迎%s来到聊天室" % name
        client.send(data.encode('utf-8'))

        while True:
            try:
                recv_data = client.recv(1024).decode('utf-8')
                print("接收到来自%s的消息:%s" % (name, recv_data))
            except Exception as e:
                print(e)
                break

            # 如果用户退出,则输入“Q”
            if recv_data.upper() == 'Q':
                self.close_client(client, address)
                break

            for c in clients:
                c.send((client_name_ip[address] + " " + time.strftime("%X") + "\n" + recv_data).encode('utf-8'))

    # 关闭客户端连接
    def close_client(self, client, address):
        self.clients.remove(client)
        client.close()
        print(self.clients_name_ip[address] + "退出聊天室")
        for c in self.clients:
            c.send((self.clients_name_ip[address] + "退出聊天室").encode('utf-8'))


if __name__ == '__main__':
    server = ServerChat()
    server.get_conn()

2.客户端代码

from PyQt5 import QtGui
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import *
import sys
import socket
from threading import Thread


class Client(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        # 设置窗口的大小和位置
        self.send = None
        self.message = None
        self.content = None
        self.setGeometry(600, 300, 360, 300)
        # 设置标题
        self.setWindowTitle('聊天室')
        # 添加背景
        palette = QtGui.QPalette()
        bg = QtGui.QPixmap('background.png')
        palette.setBrush(self.backgroundRole(), QtGui.QBrush(bg))
        self.setPalette(palette)
        self.add_ui()
        # 与服务器建立连接
        self.client = socket.socket()
        self.client.connect(('localhost', 9999))
        self.work_thread()

    # 设置界面中的组件
    def add_ui(self):
        # 多行文本框,显示聊天记录
        self.content = QTextBrowser(self)
        self.content.setGeometry(30, 30, 300, 150)
        # 单行文本框,消息发送框
        self.message = QLineEdit(self)
        self.message.setPlaceholderText("请输入消息")
        self.message.setGeometry(30, 200, 300, 30)
        # 发送按钮
        self.send = QPushButton('发送', self)
        self.send.setFont(QFont("宋体", 10, QFont.Bold))
        self.send.setGeometry(30, 240, 300, 30)

        self.send.clicked.connect(self.send_msg)

    def send_msg(self):
        # 获取文本框的内容
        msg = self.message.text()
        # 发送消息
        self.client.send(msg.encode('utf-8'))
        print("发送消息:", msg)
        if msg.upper() == 'Q':
            self.close()
            self.destroy()
        # 清空消息发送框
        self.message.clear()

    def recv_msg(self):
        while True:
            try:
                recv_data = self.client.recv(1024).decode('utf-8')
                print(recv_data)
                recv_data = recv_data + '\n'
                self.content.append(recv_data)
            except Exception as e:
                print(e)
                break

    def work_thread(self):
        Thread(target=self.recv_msg).start()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    client = Client()
    client.show()
    sys.exit(app.exec_())

在Pycharm中先运行服务器,在运行客户端,即可使用

好的,我可以帮你解决这个问题。首先,你需要安装Python和Pycharm,以便创建和运行Python代码。然后,你需要使用Python中的socket库来实现多人聊天室。下面是一个简单的示例代码: ```python import socket import threading def handle_client_connection(conn, addr, clients): while True: data = conn.recv(1024) if not data: break message = f'<{addr[0]}:{addr[1]}>: {data.decode()}' print(message) broadcast(message, clients, conn) conn.close() def broadcast(message, clients, sender_conn): for client_conn in clients: if client_conn != sender_conn: client_conn.sendall(message.encode()) def start_chat_server(host, port): clients = [] with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((host, port)) s.listen() print(f'Chat server started on {host}:{port}') while True: conn, addr = s.accept() clients.append(conn) threading.Thread(target=handle_client_connection, args=(conn, addr, clients)).start() ``` 你可以使用`start_chat_server`函数在给定的主机和端口上启动聊天服务器。服务器会接收来自多个客户端的连接,并将接收的消息广播给所有连接的客户端。如果需要,你可以添加更多功能来处理连接的认证、安全、断开连接等。 请记得使用`socket`连接时要小心,因为连接的质量可能会因网络延迟、断线等问题而受到影响。同时,也要小心处理来自不可信客户端的输入,以防止安全漏洞或恶意行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值