1 importtkinter2 from tkinter importmessagebox3 importjson4 importtime5 importthreading6 importselect7 from socket import *

8 importtraceback9 from chat importclient_draw10

11

12 classClient:13

14 #配置连接

15 defconnect(self):16 #创建socket

17 self.s =socket(AF_INET, SOCK_STREAM)18 #服务器端和客户端均在同个机器上运行

19 remote_host =gethostname()20 #设置端口号

21 port = 1200

22 #发起连接

23 self.s.connect((remote_host, port))24 print("从%s成功连接到%s" %(self.s.getsockname(), self.s.getpeername()))25 returnself.s26

27 #监听(接收)消息

28 defreceive(self, s):29 #需要监控的对象列表

30 self.my =[s]31 while 1:32 print("监听中...")33

34 #实参:

35 #第1个实参 self.my:可读的对象,监听服务器端的响应消息

36 #第2个实参:可写的对象(本例不用)

37 #第3个实参:出现异常的对象(本例不用)

38 #这三个参数内容都是被操作系统监控的,即select.select()会执行系统内核代码

39 #1)当有事件发生时,立马往下执行代码;否则阻塞监控10秒

40 #2)若监控10秒了仍无事件发生,才往下执行

41 rl, wl, error = select.select(self.my, [], [], 10)42 #返回值:

43 #rl:监听某个文件描述符是否发生了读的事件(server给client发了数据)

44 #rl列表一开始为空,只有当s发生事件了(如客户端与服务器端建立了连接),才会将s加到rl中

45 #wl:监听某个文件描述符是否发生了写的事件(如client给server发了数据)

46 #error:监听某个文件描述符是否发生了异常事件

47 #如果发生事件的对象是客户端连接对象,则代表收到服务器端数据

48 if s inrl:49 try:50 data = s.recv(1024).decode("utf-8")51 data_dict =json.loads(data)52 #根据服务器端返回的type值,执行不同逻辑

53 type = data_dict["type"]54 #登录逻辑

55 if type == "login":56 #登录成功,跳转聊天页面

57 if "000" == data_dict["code"]:58 nickname = data_dict["nickname"]59 self.chat_interface(nickname)60 #登录失败,获取失败信息

61 else:62 messagebox.showinfo(title="登录提示", message=data_dict["msg"])63 #注册逻辑

64 elif type == "register":65 #注册成功,跳转聊天页面

66 if "000" == data_dict["code"]:67 nickname = data_dict["nickname"]68 messagebox.showinfo(title="进入聊天室", message=data_dict["msg"])69 self.chat_interface(nickname)70 #注册失败

71 else:72 messagebox.showinfo(title="注册提示", message=data_dict["msg"])73 #聊天逻辑

74 elif type == "chat":75 message = data_dict["message"]76 nickname = data_dict["nickname"]77 isMy = data_dict["isMy"]78 chat_time = " " + nickname + "\t" + time.strftime("%Y/%m/%d %H:%M:%S", time.localtime()) + "\n"

79 #聊天页面,显示发送人及发送时间

80 self.txtMsgList.insert(tkinter.END, chat_time, "DimGray")81 #如果是自己发的消息,字体使用'DarkTurquoise'

82 if "yes" ==isMy:83 self.txtMsgList.insert(tkinter.END, " " + message + "\n\n", 'DarkTurquoise')84 #如果是别人发的消息,字体使用'Black'

85 else:86 self.txtMsgList.insert(tkinter.END, " " + message + "\n\n", 'Black')87 #插入消息时,自动滚动到底部

88 self.txtMsgList.see(tkinter.END)89 except(ConnectionAbortedError, ConnectionResetError):90 #将连接对象从监听列表去掉

91 self.my.remove(s)92 print("客户端发生连接异常,与服务器端断开连接")93 traceback.print_exc()94 s.close()95 exceptException as e:96 print("客户端发生了其它异常:")97 traceback.print_exc()98 s.close()99

100 #进入注册页面

101 defregister_interface(self):102 client_draw.draw_register(self)103

104 #进入聊天页面

105 defchat_interface(self, nickname):106 client_draw.draw_chat(self, nickname)107

108 #返回登录页面

109 defreturn_login_interface(self):110 #将不需要的控件先销毁

111 self.label_nickname.destroy()112 self.input_nickname.destroy()113 self.label_password.destroy()114 self.input_password.destroy()115 client_draw.draw_login(self)116

117 #获取输入框内容,进行注册验证

118 defverify_register(self):119 username =self.input_account.get()120 password =self.input_password.get()121 nickname =self.input_nickname.get()122 try:123 register_data ={}124 register_data["type"] = "register"

125 register_data["username"] =username126 register_data["password"] =password127 register_data["nickname"] =nickname128 #将dict类型转为json字符串,便于网络传输

129 data =json.dumps(register_data)130 self.s.send(data.encode("utf-8"))131 except:132 traceback.print_exc()133

134 #获取输入框内容,进行登录校验

135 defverify_login(self):136 account =self.input_account.get()137 password =self.input_password.get()138 try:139 login_data ={}140 login_data["type"] = "login"

141 login_data["username"] =account142 login_data["password"] =password143 data =json.dumps(login_data)144 self.s.send(data.encode('utf-8'))145 except:146 traceback.print_exc()147

148 #获取输入框内容,发送消息

149 defsend_msg(self):150 message = self.txtMsg.get('0.0', tkinter.END).strip()151 if notmessage:152 messagebox.showinfo(title='发送提示', message="发送内容不能为空,请重新输入")153 return

154 self.txtMsg.delete('0.0', tkinter.END)155 try:156 chat_data ={}157 chat_data["type"] = "chat"

158 chat_data["message"] =message159 data =json.dumps(chat_data)160 self.s.send(data.encode('utf-8'))161 except:162 traceback.print_exc()163

164 #发送消息事件

165 defsend_msg_event(self, event):166 #如果捕捉到键盘的回车按键,触发消息发送

167 if event.keysym == 'Return':168 self.send_msg()169

170 #聊天页面,点击右上角退出时执行

171 defon_closing(self):172 if messagebox.askokcancel("退出提示", "是否离开聊天室?"):173 self.window.destroy()174

175

176 defmain():177 chatRoom =Client()178 client =chatRoom.connect()179 t = threading.Thread(target=chatRoom.receive, args=(client,)) #创建一个线程,监听消息

180 t.start()181 #创建主窗口,用于容纳其它组件

182 chatRoom.window =tkinter.Tk()183 #登录界面控件创建、布局

184 client_draw.draw_login(chatRoom)185 #进入事件(消息)循环

186 tkinter.mainloop()187

188 if __name__ == "__main__":189 main()

群聊mysql_群聊聊天室(带图形界面)相关推荐

  1. Flutter高仿微信-第51篇-群聊-修改群名

     Flutter高仿微信系列共59篇,从Flutter客户端.Kotlin客户端.Web服务器.数据库表结构.Xmpp即时通讯服务器.视频通话服务器.腾讯云服务器全面讲解. 详情请查看 效果图: 实现 ...

  2. ChinaSkills-网络系统管理(2022改革Linux部分国产操作系统统信UOS安装运行预测[带图形界面])

    2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Linux部分从之前的Debian又换回了CentOS,不过相应增加了UOS国产操作系统. 交流共享资料群号:926132419 ...

  3. python汽车类型识别源代码带图形界面,基于PyTorach深度学习

    python汽车类型识别源代码带图形界面,基于torch深度学习,目前可识别公交车, 货车,客运车, 面包车, 皮卡车, 小轿车,程序包中已含模型文件 完整代码下载地址:python汽车类型识别源代码 ...

  4. 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器

    实现步骤: 1) 完成Java代码,编写好Java调用类. 2) 编译你的Java类. 3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件. 4) 实现头文件中的函数原型,编写 ...

  5. 【linux下用C语言编写带图形界面的成绩管理系统附带源代码】

    linux下用C语言编写带图形界面的成绩管理系统附带源代码:(下面内容请配合源代码看) 源代码下载地址:         点击打开链接 或留下联系方式,发给你 一.题目内容 嵌入式Linux数据库编程 ...

  6. Node + WebSocket + Vue 聊天室创建群聊/加入群聊功能 – 第五章

    前言 本次算是做了一个小小的专题吧,"Nodejs + WebSocket + Vue实现聊天室功能",目前还在一步一步推进,之前已经可以一对一.一对多聊天了,今天就来创建群聊组, ...

  7. 企业微信【加入群聊】群活码十问十答

    [加入群聊]用于那些场景? 二维码放到线上活动海报,线下物料或按钮形式配置到小程序等场景,用户通过扫描群二维码或点击小程序上的按钮,即可获取入群方式. 2,.群二维码的有效期是多久? 群二维码目前是没 ...

  8. 微信小程序加入(长按识别)群聊(群二维码)

    小程序里放二维码图片 目前小程序放群二维码,长按识别 [支持]企业个人微信二维码 [不支持]企业微信群固定码 [支持]企业微信群码(7天过期) [支持]个人微信码 [支持]微信群码二维码 微信小程序中 ...

  9. UI自动化控制PC端微信获取当前群聊的群友列表

    在一个月前,某个群友在获取整个群的群友信息时遇到了一点问题: 对整个群进行群友数据获取经测试确实有点棘手,下面我将我的解决过程公布给大家. 基础教程详见: https://blog.csdn.net/ ...

最新文章

  1. 手摸手教你数据可视化!(附实例讲解)
  2. ASP.NET浏览器跨域
  3. boost::mpl模块实现equal相关的测试程序
  4. @Builder(toBuilder=true) 链式初始化对象、修改对象
  5. 游戏cg提取工具_记蒼の彼方のフォーリズム の CG提取
  6. 【java】JDK安全模块JCE核心Cipher使用详解
  7. 微软与 OpenAI 达成合作,获得 GPT-3 独家使用授权!
  8. MP3播放器横向比较专题之二:闪存式
  9. WSGI、flup、fastcgi、web.py的关系
  10. C# 实体映射,对象映射框架——Mapster
  11. 中小学生计算机一等奖李广圆,喜报:昌乐一中学生在第二十届全国中小学电脑制作活动中获两项大奖...
  12. java mongodb 条件查询_java实现如下条件的mongodb查询
  13. 【原创】 ES5高效封装WIN10系统教程2020系列(六)ES5封装
  14. 新版《中国药典》提升中药标准
  15. 三洋p6系列伺服电机说明书_苏州发那科伺服电机修理刹不住
  16. 也致第一次安装Rime的你
  17. PHP快速入门指南-基础篇一
  18. 80x86系统微处理器简介
  19. 腾讯服务器状态异常是怎么回事啊,腾讯云服务器网络异常怎么办
  20. STM32CubeMX(2)——串口实现HC-05蓝牙模块与手机通信

热门文章

  1. 别生闷气了,真的会死!
  2. PAT1003. Emergency (25)
  3. 笔试常见的智力题 附答案
  4. React工作62:注意数据格式返回
  5. 一个菜鸟浅谈对 软件、程序、软件模型的认识 ——!
  6. 百度知道回答内容呈现给大家分享下
  7. 服务器cpu是否支持超频,服务器处理器也能玩超频,LGA1366神器X5698超至6.2GHz
  8. 服务器电源技术及标准介绍
  9. 接上个例子1-100之间能被三整除的流程步骤详解。
  10. Cesium示例程序学习和讲解(3)-三维模型着色