欢迎光临
我们一直在努力

用Python编写的简易聊天室之客户端

程序还有很多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()

运行后如图所示:

赞(0) 打赏
未经允许不得转载:创想未来 » 用Python编写的简易聊天室之客户端

评论 抢沙发

评论前必须登录!

 

更好的Python学习

支持快讯、专题、百度收录推送、人机验证、多级分类筛选器,适用于垂直站点、科技博客、个人站,扁平化设计、简洁白色、超多功能配置、会员中心、直达链接、文章图片弹窗、自动缩略图等...

联系我们联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册