自己动手打造 mini 型 QQ (一):动手实现局域网仿 QQ 互联
这个项目的由来是来自计算机网络课程学习的大作业,基于socket套接字写一个超小型的QQ,晚上8点到12点的奋战,编码工作大致做完了,GUI框架也有了,特此分享出来。
功能介绍
已完成
- 支持单人聊天、支持群聊(所有的人都在一个群)
- 支持单人收发文件、群收发文件
- 多线程实现并发
- 人性化的UI界面
To do list
- 给每个ip维护一个昵称,方便聊天
- 支持单人收发文件、群收发文件
- select实现并发
操作说明
如图所示:
- 左边是用户框架,右边是消息框架
- 选择`已登录用户`,消息/文件是群发的
- 选择树分支下的某个ip,消息/文件是私发给这个ip的
- `消息``文件`二选一即可发送,优先发送消息
主要技术点
- socket编程,实现点对点通信
- 消息格式统一采用json格式,统一打包和解析
- wxPython打造GUI界面
- 多线程编程、函数式编程
主要代码
采用python环境编写,pycharm+python3.5.1环境;
下面仅给出主要代码
服务端server.py
def socketHander(connectionSocket):global connectionSocketListconnectionSocketList.append(connectionSocket)connectionSocket.settimeout(2)for socket in connectionSocketList:socket.send(json.dumps(updateConnectionList()).encode("utf-8"))while True:try:# 接收消息receivedMessage = connectionSocket.recv(1024)if not receivedMessage:time.sleep(1)continuereceivedMessage = receivedMessage.decode("utf-8")receivedMessage = json.loads(receivedMessage)print(receivedMessage)type = receivedMessage.get("type")if __name__ == "__main__":serverSocket = socket(AF_INET,SOCK_STREAM)serverSocket.bind((serverIp,serverPort))serverSocket.listen(100)while True:connectionSocket,addr = serverSocket.accept()print(connectionSocket.getpeername()) #('127.0.0.1', 1958)Thread(target=socketHander,args=(connectionSocket,)).start()
客户端client.py
def socketHander(self):self.clientSocket = socket(AF_INET, SOCK_STREAM)self.clientSocket.connect((serverIp, serverPort))self.clientSocket.settimeout(2)self.ip,self.port = self.clientSocket.getsockname()print("self ip",self.ip)while True:#发送消息if len(self.sendMessage) == 0:passelse:if self.isChoosedFile == True:self.clientSocket.send(json.dumps(self.sendMessage).encode("utf-8"))self.messageList.AppendText("文件[" + self.fileName + "]发送成功\r\n")self.fileName = Noneself.dataOfChoosedFile = Noneself.isChoosedFile = Falseself.sendMessage = ""else:self.clientSocket.send(json.dumps(self.sendMessage).encode("utf-8"))self.messageList.AppendText("消息["+self.sendMessage.get("content")+"]发送成功\r\n")self.input.SetLabelText("")self.sendMessage = ""try:# 接收消息receivedMessage = self.clientSocket.recv(1024)receivedMessage = receivedMessage.decode("utf-8")receivedMessage = json.loads(receivedMessage)print(receivedMessage)type = receivedMessage.get("type")# 客户端接收服务端发来的转发消息if type == "1":print("客户端收到消息")sourceIp = receivedMessage.get("sourceIP")content = receivedMessage.get("content")if sourceIp == self.ip:passelse:self.messageList.AppendText("来自:["+sourceIp+"]的消息:["+content+"]\r\n")elif type == "2":# 客户端接收服务端发来的刷新列表请求self.userList = receivedMessage.get("content")self.setUserList()elif type == "3":filename = receivedMessage.get("filename")print("rrrr",filename)with open(filename,"w") as f:f.write(receivedMessage.get("content"))except:print("等待数据...")passpassdef setUserList(self):self.userListTree.DeleteChildren(self.rootID)for user in self.userList:# if user == self.ip:# continueself.userListTree.AppendItem(self.rootID,user)pass
函数说明
函数名称 | 函数功能 |
---|---|
socket(param1,param2) | 创建一个套接字,param1指明网络层协议,常用AF_INET(ip协议);param2指明传输层协议,常用SOCK_STREAM(TCP)、SOCK_DGRAM(UDP) |
bind((param1,param2)) | 绑定socket到指定的ip(param1)和端口(param2),注意param1,param2必须组成一个元组 |
listen(param) | 指明服务端最大的客户端连接数 |
connect((param1,param2)) | 客户端连接到指定的服务端,参数同bind() |
accept() | 无参数,服务端接收来自客户端的连接请求 |
关于配置两台PC的连接过程,我已经将过程纪录于此:局域网下两台PC机互联填坑之路
下一篇,我们将考虑将服务端部署到阿里云服务器,突破局域网的限制,随时随地聊天。
自己动手打造 mini 型 QQ (一):动手实现局域网仿 QQ 互联相关推荐
- android qq红点,Android高仿QQ小红点功能
先给大家展示下效果图: 绘制贝塞尔曲线: 主要是当在一定范围内拖拽时算出固定圆和拖拽圆的外切直线以及对应的切点,就可以通过path.quadTo()来绘制二阶贝塞尔曲线了~ 整体思路: 1.当小红点静 ...
- html5仿qq空间,JS实现的仿QQ空间图片弹出效果代码
本文实例讲述了JS实现的仿QQ空间图片弹出效果代码.分享给大家供大家参考,具体如下: function imageShow(which_click) { var image_path = which_ ...
- android+qq底部界面,Android 高仿QQ 界面滑动效果
Android高仿QQ界面滑动效果 点击或者滑动切换画面,用ViewPager实现, 首先是布局文件: android:layout_width="match_parent" an ...
- php仿qq登录界面安卓,Android_Android仿QQ登陆窗口实现原理,今天根据腾讯qq,我们做一个 - phpStudy...
Android仿QQ登陆窗口实现原理 今天根据腾讯qq,我们做一个练习,来学习如何制作一个漂亮的布局.首先看一下官方图片 还是一个启动画面,之后进入登录页面,导航页面就不介绍了,大家可以参考微信的导航 ...
- android 仿qq好友动态,Android UI仿QQ好友列表分组悬浮效果
本文实例为大家分享了Android UI仿QQ好友列表分组悬浮效果的具体代码,供大家参考,具体内容如下 楼主是在平板上測试的.图片略微有点大,大家看看效果就好 接下来贴源代码: PinnedHeade ...
- java 仿qq mysql_基于Java远程通信(仿QQ)及应用研究设计(MySQL)(含录像)
基于JAVA远程通信(仿QQ)及应用研究设计(MySQL)(含录像)(毕业论文13000字,程序代码,MySQL数据库) 随着信息社会脚步的日益加快,远程通信的应用正在人们的生产生活中扮演着极其重要的 ...
- html模仿qq邮箱,如何实现JS仿QQ邮箱收件人选择和搜索
如何实现JS仿QQ邮箱收件人选择和搜索 导语:通过下面教程的学习,大家可以掌握如何实现JS仿QQ邮箱收件人选择和搜索,更多详情请关注应届毕业生考试网. 页面截图: 主要html代码: To: Subj ...
- java仿qq群聊_[转载]仿QQ聊天室群聊的练习心得
javase的学习即将告一段落,作为最后的一个项目练习,仿聊天室的程序编写让我很是头疼了一阵子.说起来还是自己java基础不牢的缘故导致的,虽然整体框架都已经很清晰了但是实际编写过程中却依然磕磕绊绊, ...
- 防qq页面多边形html5,高仿QQ Xplan的H5页面
上个月底,在朋友圈看到一个号称"这可能是地球上最美的h5"的分享,点进入后发现这个h5还很别致,思考了一会,决定要不高仿一个? 到今天为止,高仿基本完成 除了手机端的media控制 ...
- qq农场私服php源代码,仿QQ农场源码、QQ牧场源代码(整合UCHOME)
安装步骤: 1.将压缩包内文件解压,上传upload里的所有文件到相应文件夹(你的uchome根目录下) 2.到phpmyadmin导入 uchome_happyfarm_config.sql uch ...
最新文章
- 在pcDuino上使用蓝牙耳机玩转音乐
- SpringMVC+Mybatis+MySQL配置Redis缓存
- 机器学习从入门到精通系列之BP神经网络理论知识详解
- C++ OJ在线编程常见输入输出技巧与示例
- 面试题6:从尾巴开始打印链表
- 微软顶级代码女神,编程界最有权势的女王
- 如何在JavaScript中声明名称空间?
- C/C++[codeup 1943](大数)进制转换
- 步步高告诉你如何获客增长:4种数字化驱动案例
- 英语语音篇 - 音标体系
- 三基色、对比色、互补色之间的关系,图片调色基础
- 【零基础学Python】Day7 Python基本数据类型之Set
- 利用R语言ggplot2包制作金字塔图,展示人口结构数据
- 鹅厂web前端实习面经
- SQL Server 的 count(1) 是什么意思呢
- Silverlight 结构
- 商场三十六计——第5计 “趁火打劫”
- Clickhouse 函数基础入门
- jrtplib收发实例
- 【C语言】C语言学习入门方案——极具个人风格以及力求放飞自我的