个人博客文章链接:http://www.huqj.top/article?id=169
最近突然想用socket做个聊天室程序,之前用java写过一个文件传输的程序,这次就用python做一下,顺便也学习一下python的界面设计。界面库选择了python自带的tkinter。
总的来说聊天室功能比较简单,只是一个练习用的demo,但是其中一些关于tk和socket的东西值得记录一下。最终的功能包括:注册、登录、显示聊天室在线成员、聊天。先来几张运行截图:
因为代码比较少,所以服务端和客户端的代码写在一起的,整个代码结构如下:
其中只有Server.py是服务器端的代码,服务器端没有界面。其它文件的作用分别如下:
Client.py 负责和Server的socket通信,主要是收发数据
LoginPanel.py 登陆界面
Main.py 客户端的入口,负责调度各个界面之间的切换和调用client发送接收数据
MainPanel.py 聊天室主界面
MD5 md5算法
RegisterPanel.py 注册界面
data 目录,存放用户帐号密码数据
image 目录,存放图标
完整的代码和打包的exe文件可以从 https://download.csdn.net/download/qq_32216775/10903517 下载。
启动方式为:
1)先启动Server.exe开始监听端口(12323),或者直接用python运行Server.py
2)再启动一个或多个Main.exe打开客户端的界面,或者直接用python运行Main.py
这里再代码中写的是直接连接本地(127.0.0.1)的服务器,如果需要测试客户端连接远程服务器,只需要将Client.py中第10行的ip地址换成服务器地址即可,换端口也是同理。
一些值得记录的技术细节:
①tkinter界面上显示图片的方法:
使用tkinter模块的PhotoImage类,和Lbael组件即可,代码参考下面
1 2 3 4 5 6 7 |
|
②tkinter的Entry组件实现密码框效果:
这个还是可以使用Entry组件,只需要加上属性show="*",即可将输入显示为"*"
1 2 |
|
③Text+Scrollbar组件实现聊天记录的效果:
这种效果主要考虑两个方面,一个是用不同的颜色显示区别其他人的消息和自己的消息,这个可以使用Text组件的tag_configure方法设置不同的标签,第二个是实现消息刷新时自动将滚动条滚动到底部,这个主要是通过Text的see函数实现,主要代码见下面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
④python md5加密的方法:
1 2 3 4 5 6 7 |
|
⑤python中int型数字和4字节数组之间的转换方法:
因为在socket传输的过程中,有些变长的数据,例如消息,所以这里我设计的传输协议在传输变长字符串的时候会先发送一个4字节的数据表示接下来会传多少数据,因此需要有一个方法来转换int数值和字节数组,这里使用的是int.from_bytes和int.to_bytes方法,如下
1 2 3 4 5 |
|
⑥python程序打包成可执行文件:
使用pyinstaller库,可以方便的打包python项目成exe文件,其原理就是将python解释器以及程序都打包起来,所以效率上可能会比直接运行python文件低。使用方法:1)下载安装pyinstaller库。2)使用pyinstaller打包程序。
1 2 3 |
|
其中-F选项是指打包成一个exe文件,如果不加这个选项会打包成一个附加有很多dll文件的文件夹。然后会发现当前目录下多出了build文件夹和dist目录,dist目录下就有我们需要的可执行文件。
最后贴上客户端的控制流程代码Main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
|