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
self.server_socket = socket()
self.server_socket.bind(('0.0.0.0',8999))
self.server_socket.listen(5)
self.client_thread_dict={}
self.pool=ThreadPoolExecutor(max_workers=10)
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()