程序还有很多bug,仅供学习参考使用。
import wx
from socket import *
import threading
class Client(wx.Frame):
"""
客户端类,用于创建与服务器通信的聊天窗口界面及处理相关事件。
Attributes:
name (str): 客户端名称。
isConnected (bool): 是否已与服务器建立连接。
client_socket (socket): 与服务器通信的套接字。
"""
def __init__(self, client_name):
"""
初始化客户端窗口界面。
Parameters:
client_name (str): 客户端的名称。
"""
wx.Frame.__init__(self, None, id=168, title='%s的聊天窗口' % client_name, size=(400, 600),
pos=wx.DefaultPosition)
# 初始化窗口界面元素
panel = wx.Panel(self)
box = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(box)
self.create_interface_elements(panel, box)
self.Interface = wx.TextCtrl(panel, size=(400, 280), style=wx.TE_MULTILINE | wx.TE_READONLY)
box.Add(self.Interface, 1, wx.ALIGN_CENTER)
panel.SetSizer(box)
self.input_data = wx.TextCtrl(panel, size=(400, 100), style=wx.TE_MULTILINE)
box.Add(self.input_data, 1, wx.ALIGN_CENTER)
panel.SetSizer(box)
# 创建清空和发送消息按钮
self.create_action_buttons(panel, box)
# 绑定按钮事件
self.Bind(wx.EVT_BUTTON, self.connect_to_server, connect)
self.Bind(wx.EVT_BUTTON, self.send_to_server, send)
self.Bind(wx.EVT_BUTTON, self.go_out, break_off)
self.Bind(wx.EVT_BUTTON, self.reset, clear)
self.name = client_name
self.isConnected = False
self.client_socket = None
def create_interface_elements(self, panel, box):
"""
创建连接和断开按钮,并布局到窗口。
Parameters:
panel (wx.Panel): 窗口的面板。
box (wx.BoxSizer): 窗口的布局管理器。
"""
gl = wx.FlexGridSizer(wx.HORIZONTAL)
connect = wx.Button(panel, label='连接', size=(100, 30))
break_off = wx.Button(panel, label='断开', size=(100, 30))
gl.Add(connect, 1, wx.TOP | wx.LEFT)
gl.Add(break_off, 1, wx.TOP | wx.RIGHT)
box.Add(gl, 1, wx.ALIGN_CENTER)
def create_action_buttons(self, panel, box):
"""
创建清空和发送消息按钮,并布局到窗口。
Parameters:
panel (wx.Panel): 窗口的面板。
box (wx.BoxSizer): 窗口的布局管理器。
"""
gl2 = wx.FlexGridSizer(wx.HORIZONTAL)
clear = wx.Button(panel, size=(180, 50), label="清空")
send = wx.Button(panel, size=(180, 50), label="发送")
gl2.Add(clear, 1, wx.TOP | wx.LEFT)
gl2.Add(send, 1, wx.TOP | wx.RIGHT)
box.Add(gl2, 1, wx.ALIGN_CENTER)
def connect_to_server(self, event):
"""
建立与服务器的连接。
Parameters:
event: 触发此函数的事件对象。
"""
if not self.isConnected:
server_host_port = ('localhost', 8899)
self.client_socket = socket(AF_INET, SOCK_STREAM)
self.client_socket.connect(server_host_port)
self.client_socket.send(self.name.encode('utf-8'))
self.isConnected = True
client_thread = threading.Thread(target=self.receive_data)
client_thread.setDaemon(True)
client_thread.start()
def receive_data(self):
"""
不断从服务器接收消息并显示在界面上。
"""
while self.isConnected:
data = self.client_socket.recv(1024).decode('utf-8')
self.Interface.AppendText('%s\n' % data)
def send_to_server(self, event):
"""
发送输入的消息到服务器。
Parameters:
event: 触发此函数的事件对象。
"""
if self.isConnected:
info = self.input_data.GetValue()
if info != '':
self.client_socket.send(info.encode('utf-8'))
self.input_data.SetValue('')
def go_out(self, event):
"""
断开与服务器的连接。
Parameters:
event: 触发此函数的事件对象。
"""
self.client_socket.send('buy'.encode('utf-8'))
self.isConnected = False
def reset(self, event):
"""
清空输入框。
Parameters:
event: 触发此函数的事件对象。
"""
self.input_data.Clear()
if __name__ == '__main__':
app = wx.App()
name = input("请输入你的名字:")
Client(name).Show()
app.MainLoop()
运行后如图所示:

评论前必须登录!
注册