python聊天室

import wx
from socket import *
import threading
from concurrent.futures import ThreadPoolExecutor
# 服务端

class ClientThread(threading.Thread):
    def __init__(self,socket,name,server):
        threading.Thread.__init__(self)
        self.client_socket=socket
        self.client_name=name
        self.server=server
        self.isOn=True
    def run(self):
        while self.isOn:
            text = self.client_socket.recv(1024).decode("utf8")
            if text == "断开连接":
                self.isOn = False
                self.server.send("【服务器消息%s离开了聊天室】 \n"%self.client_name)
            else:
                self.server.send("【%s】%s \n"%(self.client_name,text))
        self.client_socket.close()
class Server(wx.Frame):
    def __init__(self):
        # 实例属性
        self.isOn = False #服务器启动的状态
        # 创建socket对象
        self.server_socket = socket()
        # 绑定ip地址和端口号
        self.server_socket.bind(('0.0.0.0',8999))
        # 设置监听
        self.server_socket.listen(5)
        # 保存所有的客户端
        self.client_thread_dict={}
        #创建线程池
        self.pool=ThreadPoolExecutor(max_workers=10)


        # 界面布局
        # 调用父类的init方法
        wx.Frame.__init__(self,None,title="多人聊天室",pos=(0,50),size=(450,600))
        self.pl=wx.Panel(self)

        # 创建按钮
        #启动服务器
        self.start_server_btn = wx.Button(self.pl,pos=(10,10),size=(200,40),label="启动服务器")
        #保存聊天记录
        self.save_text_btn = wx.Button(self.pl,pos=(220,10),size=(200,40),label="保存聊天记录")
        # 聊天框
        self.text = wx.TextCtrl(self.pl, pos=(10, 60), size=(415, 400), style=wx.TE_READONLY | wx.TE_MULTILINE)
        # 按钮的事件绑定
        self.Bind(wx.EVT_BUTTON,self.start_server,self.start_server_btn)
        self.Bind(wx.EVT_BUTTON, self.save_text, self.save_text_btn)
    def start_server(self,event):
        print("启动服务器")
        self.text.AppendText("【服务器启动成功】 \n")
        if not self.isOn:
            self.isOn=True
            # 创建线程
            main_thread=threading.Thread(target=self.main_thread_fun)
            #设置守护线程
            main_thread.daemon=True
            # 启动线程
            main_thread.start()
    def main_thread_fun(self):
        while self.isOn:
            client_socket, client_addr = self.server_socket.accept()
            print(client_addr)
            client_name=client_socket.recv(1024).decode("utf8");
            print(client_name)
            client_thread = ClientThread(client_socket,client_name,self)
            #保存客户端
            self.client_thread_dict[client_name]=client_thread
            self.pool.submit(client_thread.run)
            self.send("【服务器通知】欢迎%s进入聊天室 \n"%client_name)

    def send(self,text):
        self.text.AppendText(text)
        for client in self.client_thread_dict.values():
            if client.isOn:
                client.client_socket.send(text.encode("utf8"))
    def save_text(self, event):
        print("保存聊天记录")
        log_text=self.text.GetValue()
        with open("chat.log" , "a+",encoding="GBK") as f:
            f.write(log_text)


if __name__ == '__main__':
    # 创建应用程序对象
    app = wx.App();
    # 创建服务器窗口
    server = Server();
    # 显示服务端窗口
    server.Show()
    # 一直循环显示
    app.MainLoop()
import wx
from socket import *
import threading
from faker import Faker
# 客户端
class Client(wx.Frame):
    #构造方法
    def __init__(self):
        # 实例属性
        self.name = Faker("zh_CN").name() # 客户端的名字
        self.isConnected = False # 客户端是否连接服务器
        self.client_socket = None

        # 界面布局
        wx.Frame.__init__(self,None,title=self.name+"聊天室客户端",size=(450,660),pos=(100,50))
        # 创建面板
        self.pl = wx.Panel(self)
        # 创建按钮
        # 加入聊天室
        self.conn_btn = wx.Button(self.pl,label="加入聊天室",pos=(10,10),size=(200,40))
        # 离开聊天室
        self.dis_conn_btn = wx.Button(self.pl, label="离开聊天室", pos=(220, 10), size=(200, 40))
        # 清空按钮
        self.clear_btn = wx.Button(self.pl, label="清空按钮", pos=(10, 580), size=(200, 40))
        # 发送按钮
        self.send_btn = wx.Button(self.pl, label="发送按钮", pos=(220, 580), size=(200, 40))
        # 创建聊天框
        self.text = wx.TextCtrl(self.pl,pos=(10,60),size=(415,400),style=wx.TE_READONLY|wx.TE_MULTILINE)
        # 创建输入框
        self.input_text = wx.TextCtrl(self.pl,pos=(10,470),size=(415,100),style=wx.TE_MULTILINE)
        # 按钮的事件绑定
        self.Bind(wx.EVT_BUTTON,self.clear,self.clear_btn)
        self.Bind(wx.EVT_BUTTON, self.dis_conn, self.dis_conn_btn)
        self.Bind(wx.EVT_BUTTON, self.conn, self.conn_btn)
        self.Bind(wx.EVT_BUTTON, self.send, self.send_btn)

    # 点击加入聊天室 触发函数
    def conn(self,event):
        print("点击加入聊天室")
        if not self.isConnected:
            self.isConnected = True
            self.client_socket=socket();
            self.client_socket.connect(("127.0.0.1",8999))
            self.client_socket.send(self.name.encode("utf8"))
            main_thread=threading.Thread(target=self.recv_data)
            main_thread.daemon=True
            main_thread.start()

    def recv_data(self):
        while self.isConnected:
            recv_data=self.client_socket.recv(1027).decode("utf8")
            self.text.AppendText(recv_data)
    # 点击离开聊天室 触发函数
    def dis_conn(self,event):
        print("点击离开聊天室")
        self.isConnected=False
        self.client_socket.send("断开连接".encode("utf8"))

    # 点击清空按钮 触发函数
    def clear(self,event):
        print("点击清空按钮")
        self.input_text.Clear()
    # 点击发送按钮 触发函数
    def send(self,event):
        if self.isConnected:
            text = self.input_text.GetValue();
            if text != "":
                self.client_socket.send(text.encode("utf8"))
                self.input_text.Clear()
if __name__ == '__main__':
    # 创建应用程序对象
    app = wx.App()

    # 创建客户端窗口
    client = Client()
    # 显示客户端窗口
    client.Show()
    # 一直循环显示
    app.MainLoop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值