TCP/IP简易聊天软件C++实现 - 应用层协议

来源:互联网 发布:购买域名后需要备案吗 编辑:程序博客网 时间:2024/06/02 13:02

第一步:需求

软件需要实现的功能:

0.登录  1.私聊   2.群聊  3.文件传输

第二步:考虑使用的网络通信协议。

鉴于ICQ使用的TCP协议,采用TCP实现聊天和文件传输。因为服务器端对于用户发送过来的数据要进行区分是什么类型的数据,比如聊天、文件等等,所以设计成在应用层实现自己的协议,所谓协议,说白了就是一种约定或称为规则,而这种约定比较多的呈现方式就是格式。

自定义协议的核心有两个:1. 控制码2. 流程控制用Socket进行通信,发送的数据包一定是有结构的,类似于:数据头+数据长度+数据内容+校验码+数据尾。这个你定义一个Struct包装起来即可。控制码是协议的基础信息,主要用来解释数据包的基本信息,通信触发的动作等,以便告知收到数据包之后应该如何处理数据包。例如,你传输文件的时候,一般会经过“传输开始 - 传输中 - 传输结束”三个阶段,那么Sender针对不同的阶段就要定义不同的命令控制码,以便让Receiver知道传输处于什么过程,这样Receiver收到数据包之后便可以知道下一步该做什么。具体实现上类似于:switch(iCmdType){case CMD_BEGIN_TRANSFER:    Begin();    break;case CMD_TRANSFERRING:    Transfer();    break;case CMD_FINISH_TRANSFER:    Finish();    break;......}而流程控制是协议的核心所在。以TCP/IP为例,Client和Server如何知道双方已经正确建立了连接?答案就是“三次握手”。三次握手就是流程控制。这个就需要对应用程序的通信流程把握的非常熟悉。“把数据从Client 发送到服务器中Server”,Server如何判断已经完整而且无误地收到了一个来自于Client 的数据包?答案就是靠自定义的协议控制码(数据长度)。收到的数据如果是正确的,回应什么给Client ?是错误的,又该回什么给Client ?这就要靠协议所定义的流程控制。

以上是从网上找的,而我们的协议做得比较简单,因为我们的需求很简单。下面就给出应用层协议的格式,暂且让我称之为ZChat协议。


协议版本控制字段源用户id       目的用户id8bit           8bit       32bit         32bit
其中控制字段包括:
</pre></p><pre name="code" class="plain">私聊       0x01,群聊       0x02,文件       0x03,登录       0x06,成功       0x07,失败       0x08,用户id请求 0x0C,群组id请求 0x0D,加入私聊   0x0E,加入群聊   0x0F,退出私聊   0x10,退出群聊   0x11好友列表   0x12群组列表   0x13个人注册   0x14


第三步:考虑流程控制
1.登陆/注册
(1)客户端发送登陆/注册请求,发送用户名和密码
(2)服务器返回用户id以及登陆成功/失败信息
2.下载好友/群组列表
(1)客户端发送下载好友/群组列表请求
(2)服务器端多次(每次发送一个)发送好友/群组名给客户端
(3)服务器发送成功/失败信息
3.私聊/群聊
(1)客户端发送请求加入私聊/群聊

0 0
原创粉丝点击