多人聊天室:业务分析
1、可以有多个客户端,每个客户端都有自己的名字(唯一)。
2、客户端可以发送一条消息到聊天室,所有人都可以看到刚刚发送的该条消息。
3、客户端只有一个,服务单独的主线程启动和管理服务器。
4、在服务器中如果有一个客户端连接成功之后,开启一个新的线程和当前客户端会话。
5、客户端和服务器端都有界面。
首先从客户端开始
1、开发客户端界面:使用wxpython模块开发UI。
2、开发服务器端页面,并初始化一些属性。
3、当服务器启动之后,如果客户端连接,则需要创建对应的会话线程。
4、客户端连接服务器。
5、服务器再收到客户端连接之后,需要再文本框中显示提示信息,同时还需要通知所有的客户端。
6、客户端发送消息到聊天室
7、客户端断开连接
聊天室客户端:
import wx
from socket import *
import threading
class Client(wx.Frame):
def __init__(self, c_name): # c_name客户端名字
# 调用父类初始化函数
wx.Frame.__init__(self, None, id=101, title='%s的客户端界面' % c_name, pos=wx.DefaultPosition, size=(500, 700))
pl = wx.Panel(self) # 在窗口中初始化一个面板
# 在面板里面回放一些按钮、文本框、文本输入框等,把这些对象统一放入一个盒子里面
box = wx.BoxSizer(wx.VERTICAL) # 在盒子里面垂直方向自动排版
g1 = wx.FlexGridSizer(wx.HORIZONTAL) # 创建可伸缩的网格水平布局
# 创建两个按钮
conn_button = wx.Button(pl, size=(250, 40), label="连接")
dis_conn_button = wx.Button(pl, size=(250, 40), label="断开")
g1.Add(conn_button, 1, wx.Top | wx.LEFT) # 链接按钮布局在左边
g1.Add(dis_conn_button, 1, wx.Top | wx.RIGHT) # 断开按钮布局在右边
box.Add(g1, 1, wx.ALIGN_CENTER) # ALIGN_CENTER两个按钮联合居中
# 创建聊天内容的文本框,不能写消息:wx.TE_MULTILINE-->多行, wx.TE_READONLY-->只读
self.text = wx.TextCtrl(pl, size=(500, 400), style=wx.TE_MULTILINE | wx.TE_READONLY)
box.Add(self.text, 1, wx.ALIGN_CENTER)
# 创建聊天的输入文本框,可以写内容
self.input_text = wx.TextCtrl(pl, size=(500, 180), style=wx.TE_MULTILINE)
box.Add(self.input_text, 1, wx.ALIGN_CENTER)
# 再创建两个按钮,分别为发送和重置
g2 = wx.FlexGridSizer(wx.HORIZONTAL)
clear_button = wx.Button(pl, size=(250, 40),