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
- TCP/IP简易聊天软件C++实现 - 应用层协议
- TCP/IP应用层协议
- TCP /IP 协议-应用层协议
- 使用TCP/IP协议实现聊天程序
- TCP/IP协议--IP层ip_local_deliver实现
- TCP/IP协议(四)---应用层
- TCP/IP笔记(八)应用层协议
- C #应用SOCKET实现TCP/IP协议的通讯
- TCP/IP协议族之应用层协议 ( DNS HTTP )
- llinux C练习十 Tcp通信select实现简易聊天
- TCP/IP协议族-----17、应用层简介
- TCP/IP协议简介(五) 之 应用层
- TCP/IP 关于一些在应用层的协议
- TCP/IP协议-应用层协议端口号及各层协议数据单元
- TCP/IP详解:协议(TCP协议在应用层的应用)
- 网络编程应用:基于TCP协议【实现一个聊天程序】
- tilera netlib应用层协议栈-IP层实现方式
- TCP/IP 七层协议
- IE 滤镜实现图片旋转效果
- <%%>创建内联代码块(表达式)
- Friendship and Mobility :User Movement In Location-Based Social Networks(2013.10.10)
- AndroidManifest.xml配置文件详解
- 【NOIP2008】传纸条解题报告-双线程dp||最大费用最大流
- TCP/IP简易聊天软件C++实现 - 应用层协议
- android adb shell 命令大全
- C语言实现2048游戏
- 华为实习面试总结
- 一个小细节
- 使用智能指针优化C++类对象深度复制效率问题
- 黑马程序员--- 学习笔记(第二十三天)
- POI 导入excel数据自动封装成model对象--代码
- Go语言 Go加密之DES