1 说在前面
本文是面向程序设计的初学者和喜欢DIY的朋友,主要目的就是教读者用VC++实现一个简单的QQ客户端,因为比较简单,被作者成为 QQ1986。如果只是想使用QQ的话,自己动手做的,肯定没有腾讯官方的好, QQ1986什么高级功能都没有,可以说是垃圾产品,所以本文仅当娱乐用途…
看懂本文,你需要掌握的知识:Windows编程,VC & MFC,以及一定的网络和多线程编程基础.
转载请保留版权和链接 ┟ 湘生福地 ┦www.Az86.cn,任何问题请联系 admin@az86.cn
1.1 QQ版本
腾讯的协议在不断更新,但一些比较经典的协议仍在使用比如2005,这里编写的QQ客户端使用的就是2005版本的QQ协议。因为2005版的大部分协议已经非正常的公开,我们可以省去枯燥的协议分析步骤。
1.2 界面
为了简单起见,略去了QQ的那些界面,将其整合在一个对话框内。
1.3 主要功能
只提供基本功能哦,登陆,下载好友,发送和接收文本消息,当然通过学习本文后,你可以参考公布的2005协议,自己添加想要的功能, 如文件传输,视频等等。
2. 系统设计
整个系统从基本功能上讲可以分为三个过程,登陆,聊天,退出,因为退出在程序关闭后会与服务器自动断开,这部分功能被省略。
对一个Windows网络通讯软件来说,系统又可以分为交互界面,控制主程序,网络通讯等三大模块。而各个模块的设计,是根据基本功能的需求来决定。这里系统设计主要是指这交互界面,控制主程序,和网络通讯模块的设计。
2.1交互界面
登陆模块,对交互界面的需求有:选择网络,用户输入用户名和密码,和登陆按钮。
聊天模块,对交互界面的基本需求有:好友列表,发送消息框,接受消息框,以及发送按钮。
退出模块,被省略。
从上面的描述看,我们对界面的要求变得比较明朗,总结如下:(参考界面发布的图像)
l 一个Combo Box来选择网络
l 两个Edit Box 用作输入用户名,密码
l 一个List Box 来显示好友
l 两个Edit Box 用来显示消息和输入消息
l 两个Button 一个用来登陆,另一个用来发送消息
l 若干Static text 来显示固定的文本和系统信息
当然你可以使用 Tree control 控件来显示好友,rich edit box来输入和显示消息,那样界面会更友好,本文为了简单起见略去。
2.2 网络通讯
简单起见,在这里仅使用UDP协议。
用两个消息队列,一个用来发出消息,一个用来接收消息。
一个发送消息函数,从发出消息队列中取出一个消息,并发送。
一个接受消息函数,从网络中接收消息,并发送到接收消息队列中。
2.3 控制主程序
主程序是本文的重点部分,主要介绍线程及其函数,程序模块等.
2.3.1 主要线程介绍
主程序共分为四个线程,一个线程发送消息,一个线程接收消息,一个线程处理消息,一个控制界面和主流程。
发送消息线程,调用网络通讯模块中的发送消息函数。
接收消息线程,调用网络通讯模块中的接收消息函数。
处理消息线程,调用接收消息处理函数。
主线程,响应界面和控制流程。
2.3.2 系统框架
整个系统框架分为两部分,登陆和聊天。
登陆部分:
Step1 向服务器群发登陆请求
Step2 收到服务器回应,向服务器请求登陆令牌(logintoken)
Step3 收到登陆令牌,发送登陆请求,如果成功则返回一个会话密钥(Session Key),以后的通讯就靠它加密,解密;如果服务器满员,将收到一个重定向到其他服务器的包(package),里面包括服务器的IP和端口号,返回Step1。
Step4 向服务器请求下载个人资料。
Step5 向服务器请求下载好友列表。
聊天部分:
聊天可简单的分为发送消息和接收消息。
发送消息,将要发送的内容打包成消息协议的格式发送,等待回执,如果0.5秒没有响应,重复发送该消息。
接收消息,从网络中接收消息包,回复一个回执包,解密接受到的消息包,并显示在消息框内。
3. 具体编码实现
3.1 选择网络
本部分请参考本站文章,在VC++6.0中调用GetAdaptersInfo枚举网卡。
3.2 网络通讯底层,UDP协议
本部分比较简单,用Windows Soket创建数据报(UDP)套接字,使用recvfrom和sendto 接收和发送消息,详细过程略去,请参考源代码
3.3 加密算法
整个过程采用的加密算法有一个非对称的MD5和对称的TEA。
3.3.1 MD5
请参考 http://baike.baidu.com/view/7636.htm
3.3.2 TEA填充加密算法
腾讯虽然采用了标准的TEA算法,但对采用了交织及随机填充随机数的技术。具体请参考《TEA算法在QQ中的应用》
3.4 通讯协议
请参考LumaQQ 2005
3.5 流程控制
QQ1986为了方便,将所有整个流程分为若干状态,当处于某种状态时,由主线程来指挥做具体的事情。
这些状态分别为:
QQ_ZERO 零状态,即启动程序时的初始状态
QQ_START 程序初始化,已经启动各个需要线程
QQ_PREFIRST 初次向服务器发送登陆请求
QQ_WF_PREFIRST 等待服务器返回处理的初次发送登陆请求
QQ_REDIRECT 重定向
QQ_WF_REDIRECT 等待系统返回处理的重定向请求
QQ_LOGINTOKEN 请求登陆令牌
QQ_WF_LOGINTOKEN 等待系统返回处理的请求登陆令牌
QQ_LOGIN_IN 登陆服务器
QQ_WF_LOGIN_IN 等待系统返回处理的登陆服务器
QQ_PRE_ONLINE_FIR 请求下载个人资料
QQ_WF_PRE_ONLINE_FIR 等待系统返回个人资料
QQ_PRE_ONLINE_SEC 请求下载好友列表
QQ_WF_PRE_ONLINE_SEC 等待系统返回好友列表
QQ_ONLINE处于已登陆,可以聊天状态
分享到:
相关推荐
【描述】提到“自己用Java写”,意味着这个项目是基于Java编程语言实现的,Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性而闻名。项目开发者可能使用了Java的基础语法、类库和设计模式...
《C#语言构建QQ式聊天软件的深度解析》 在信息技术高速发展的今天,掌握编程技能,尤其是像C#这样的高级编程语言,对于个人...实践是检验真理的唯一标准,希望读者能动手尝试,从编写代码的过程中提升自己的编程技能。
网络编程是计算机科学中的一个重要领域,它涉及到通过网络在不同设备间交换数据。在这个主题中,我们将探讨如何使用用户数据报协议...通过动手实践,你将更好地理解网络编程中的挑战以及如何通过代码解决这些问题。
这个项目可能是为了学习、研究或者改进,而不是官方的QQ客户端。 【描述】中提到,开发环境是MyEclipse,这是一个集成开发环境(IDE),专为Java应用程序开发设计。MyEclipse提供了代码编辑、调试、部署等多种功能...
这种行为在用户不知情的情况下,可能会影响QQ客户端的正常使用,也可能涉及到用户隐私的泄露或数据安全问题。 而进程注入是另一种重要的技术手段,它允许一个进程将代码注入到另一个进程空间中执行。这种技术被QQ...
【标题】"Csharp写的qq聊天软件"是一个使用C#编程语言开发的即时通讯应用程序,模仿了QQ的功能和用户体验。C#,全称C Sharp,是微软...下载该项目后,可以逐步分析源码,动手运行,从而深入学习并提升自己的编程技能。
1. **网络编程**:VB.NET提供了System.Net命名空间,包含Socket、TcpClient、TcpListener等类,用于实现客户端-服务器通信,模拟QQ的即时消息传递。 2. **用户界面设计**:使用Windows Forms或WPF(Windows ...
这个项目旨在帮助开发者理解并实现类似QQ这样的即时通讯(IM)系统的基础功能,包括客户端和服务端的交互。通过分析和研究这个项目,你可以深化对Java编程语言、网络通信协议以及软件架构设计的理解。 首先,项目的...
【纯Java代码实现的QQ项目】是一个专门为Java爱好者设计的编程实践案例,它展示了如何使用Java语言来构建一个类似于QQ的即时通讯应用。这个项目旨在帮助开发者深入理解Java编程、网络通信以及多线程等核心概念,同时...
【标题】:“自己动手写分享插件” 在互联网上,分享功能已经成为网站和应用程序不可或缺的一部分。用户可以方便地将感兴趣的内容转发到各种社交平台,如微信、微博、QQ空间等。本教程旨在引导你了解如何从头开始...
在实现这个项目时,你可能会使用到诸如Python的socket库这样的编程工具,通过编写服务器端和客户端的代码,实现数据的发送和接收。在无界面的QQ中,交互可能通过命令行或控制台完成,用户输入消息,程序通过TCP发送...
10. **实践与分享**:理论学习的同时,动手实践并分享自己的代码作品,可以快速提升技能,并与他人交流经验。 总的来说,“QQ留言代码 超级”意味着深入研究和掌握如何通过编程手段让QQ留言变得生动有趣,这涵盖了...
【C#仿QQ源码】是一个项目,旨在利用C#编程语言实现类似腾讯QQ的即时通讯软件。这个项目的核心目标是学习...通过实际动手编写这样一个项目,可以加深对C#和即时通讯软件原理的理解,为今后的软件开发工作奠定坚实基础。
《基于VC++实现的局域网聊天通信工具——仿飞秋、飞鸽传书与QQ》 ...尽管市面上已有许多成熟的即时通讯软件,但自己动手开发这样一个工具,无疑是对技术理解的深入实践,也有助于提升个人的编程能力。
《使用Delphi构建局域网仿QQ聊天程序详解》 在信息技术日新月异的今天,个人间的交流方式也发生了巨大的变化,其中即时...实践是检验真理的唯一标准,动手去编写这样的程序,无疑是对自身编程能力的一次锻炼和提升。
《基于Winform+SQLServer2008R2的仿QQ聊天系统开发详解》 本文将深入探讨如何利用C#编程语言、SQL Server 2008 R2数据库...实践是最好的老师,动手开发这样一个仿QQ聊天系统,无疑能提升你的编程技能和问题解决能力。
在本压缩包中,包含的文件"MyQQ"很可能是一个简单的QQ客户端模拟程序,它可能实现了基本的聊天功能,如注册、登录、发送和接收消息。通过分析和学习这个源代码,初学者可以深入理解以下关键知识点: 1. **C#基础...
4. **网络通信**:QQ作为即时通讯软件,其核心功能是实现客户端之间的数据传输。在源码中,可能使用了TCP/IP协议栈进行网络通信,通过套接字(socket)编程实现数据的发送和接收。理解这部分代码可以帮助我们掌握...
“控件自绘”是另一个关键点,它是指开发者不依赖操作系统默认的控件渲染,而是自己动手绘制控件的外观。这通常用于实现特殊的视觉效果或定制化的控件样式。自绘控件需要对图形API有深入理解,例如GDI+或Direct2D,...
【标题】"net效仿QQ聊天室"是一个基于.NET技术构建的简单聊天室项目,旨在模仿QQ聊天室的功能,提供一个基础的学习平台,帮助开发者理解即时通讯应用的基本原理和实现方式。这个项目对于想要深入学习.NET框架、网络...