第三章 协议设计涉及知识简介 (1)创建CSocket类对象。
(2)如果创建服务器端套接字,则调用函数Bind()绑定本地IP和端口,然后调用函数Listen()监听客户端的请求。如果请求到来,则调用函数Accept()响应该请求。如果创建客户端套接字,则直接调用函数Connect()连接服务器即可。 (3)创建与CSocket类对象相关联的CSocketFile类对象。 (4)创建与CSocketFile类相关联的CArchive对象。
(5)使用CArchive类对象在客户端和服务器之间进行数据传输。
(6)关闭或销毁CSocket类、CSocketFile类和CArchive类的3个对象。
3.10 同步、异步、阻塞和非阻塞
同步(synchronous):所谓同步方式,就是发送方发送数据包以后,不等接受方响应,就接着发送下一个数据包。
异步(asynchronous):异步方式就是当发送方发送一个数据包以后,一直等到接受方响应后才接着发送下一个数据包。
阻塞(Block):指执行此套接字的网络调用时,直到调用成功才返回,否则此套节字就一直阻塞在网络调用上,比如调用StreamReader 类的Readlin ( )方法读取网络缓冲区中的数据,如果调用的时候没有数据到达,那么此Readlin ( )方法将一直挂在调用上,直到读到一些数据,此函数调用才返回
非阻塞(Unblock):指在执行此套接字的网络调用时,不管是否执行成功,都立即返回。同样调用StreamReader 类的Readlin ( )方法读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。
在Windows网络通信软件开发中,最为常用的方法就是异步非阻塞套接字。平常所说的C/S(客户端/服务器)结构的软件采用的方式就是异步非阻塞模式的。
3.11 多线程
3.11.1 概念
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
3.11.2 线程和进程的区别在于
子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。
7
第三章 协议设计涉及知识简介 3.11.3 多线程处理的优点
多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态。
(1)当前没有进行处理的任务可以将处理器时间让给其他任务。
(2)占用大量处理时间的任务可以定期将处理器时间让给其他任务。 (3)可以随时停止任务
(4)可以分别设置各个任务的优先级以优化性能。 (5)是否需要创建多线程应用程序取决于多个因素。在以下情况下,最适合采用多线程处理:
(6)耗时或大量占用处理器的任务阻塞用户界面操作。
(7)各个任务必须等待外部资源(如远程文件或 Internet 连接)。
3.11.4 线程缺点
(1)如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。 (2)更多的线程需要更多的内存空间。
(3)线程可能会给程序带来更多“bug”,因此要小心使用。 (4)线程的中止需要考虑其对程序运行的影响。
(5)通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
3.11.5 线程同步
是多线程编程的难点,在多线程应用中,考虑不同线程之间的数据同步和防止死锁。当两个或多个线程之间同时等待对方释放资源的时候就会形成线程之间的死锁。为了防止死锁的发生,需要通过同步来实现线程安全。MFC中线程的同步最常用的四种同步对象:
(1)临界区(CCriticalSection) (2)事件(CEvent) (3)互斥量(CMutex) (4)信号量(CSemaphore)
8
第三章 协议设计涉及知识简介
9
第四章 10 需求分析
第四章 需求分析
4.1 整体需求分析
随着社会的发展,计算机网络日新月异,人们的交流方式越来越多,传统的交流方
式,如:Email,电话等已经受到了挑战,利用网络免费,及时的和好友取得联系已经成为通信的必然趋势。因此出现了QQ,微信等聊天工具。然而这些聊天工具虽然方便、实用,但是,由于其功能太多,如游戏,社区,电子邮件等功能,占据内存空间过大,从一定程度上来说,更多的已经演变成了一种娱乐工具,不能作为即时通讯的专用工具。签于此,一个内容简单,消耗内存小,友好简洁的即时通讯的网络聊天工具的开发就显得必不可少了,而我们知道,网络通讯少不了相应的通信协议的支持,所以设计一个专用于支持计算机之间即时通讯的网络聊天协议就显得必不可少。
4.2 可行性分析
4.2.1 技术可行性
Visual C++ 6.0提供了功能强大的开发平台,编码,调试和运行于一体,使得程序界面的实现简单、快速、标准。MFC提供了简单易用的框架,用其进行前台设计,方便简单。Winsock为Windows网络编程提供了丰富的接口技术,结合多线程技术,使得此处的基于TCP网络编程具有良好的健壮性和强大的可扩展性。同时,MSDN Library为编码提供了大量可直接调用的函数,为编码的是吸纳提供了很大的方便,在MFC编码过程中,Visual Assist X具有代码输入更迅速,错误自动校正,信息获取更加快速,增加了色彩和格式,拼写检查,拓展了基本编辑等功能,具有强大的编辑特色,增强Microsoft开发环境下的编辑能力,提高了生产效率。本软件最后所生成的.EXE可执行文件具有很好的可移植性。
4.2.2 经济可行性
经济可行性研究主要是预估费用支出和对项目的经济效益进行评价,由于本系统的主要背景是毕业课程设计,不注重直接的经济效益和其后的发展方向,只在注重自身水平和能力的提高,对自身的经济要求也不高,只要有一台能运行Visual C++6.0软件的电脑便可,所以不用考虑到经济问题。
4.2.3 运行可行性
本系统为一个小型的即时聊天系统,所耗费的资源非常的小,现在一般的电脑无论是硬件还是软件都能够满足条件,因此,本系统在运行上是可行的。
综上所述,本系统的设计与开发在技术上和硬件设备上的条件都是满足的,因此,它是可行的。
10
第五章 概要设计
第五章 概要设计
5.1 性能要求
随着网络的发展,不同的开发商开发了不同的即时通讯的应用协议。为了使通信成功可靠,网络中的同一种即时通讯软件,都必须使用同一语言,不能带有方言。因而必须严格的定义不同用户之间的每个包中每个字节中的每一位。这些协议绝大多数建立在TCP/IP协议族上,约定好通用的通信方式、语义、及数据格式,即即时通讯应用协议。已经开发的众多协议中笔者认为较为成功的当属QQ、微信、淘宝旺旺等。不同的开发商因即时通讯软件的应用重心不同,其协议的侧重点也不同,且绝大多数为厂商保密。本协议的设计旨在开发一开放的、安全的、可扩展的、易于程序开发的即使通讯软件协议。
5.1.1在设计即时通讯协议时,笔者认为有几点必须考虑: (1)协议对下层协议的支持
考虑到程序开发者对下层协议选择上有不同的看法,协议设计时必须考虑下层的协议,以便程序开发者根据不同的下层协议运用不同的传输手段。 (2)数据的保密
由于即时通讯软件的不同需求,开发者可能要对传输的数据进行加密,因此在协议中应该对数据是否加密、加密算法留有标记。本次协议设计未实现这一点。 (3) 传输可靠性:
由于网络传输的不稳定性,根据经验大于1024byte的包较小于1024byte的包更易丢失,因此在应用层传给传输层的包应小于1000byte,而实际的数据包往往大于1000byte,因此应在协议中留有分篇传输的位.本次设计也未能实现这一点,只是通过限制传输的数据来机械的控制了这一点。 (4)协议的通用性与可扩展性:
由于无法对新技术的发展有精确的把握应在协议中留有冗余位,以便适应新的应用。 (5)协议的简洁高效性:
协议的设计不应过于复杂,应给程序员开发程序留有”自由空间”。
5.2 通讯协议格式设计
5.2.1协议字段设计图示
此通讯协议具体格式,包括判断消息属于哪个类型、消息发送者、消息接收者、发送数据、消息长度共5部分,其字节分配如图所示与表示的含义: 标识 fun sender[28] RecerverID[28Connect[102Len ] 4] 数据类型 enum(FUN) char char char int 含义 消息类型 发送者 接受者 发送数据 消息长度 长度4 28 28 1024 4 (byte) 5.2.2协议字段设计说明
11