人类已进入信息社会。基于网络的即时通讯方式如微信、QQ、飞信等,已逐渐取代传统的交流沟通方式,极大融入我们生活的各个领域。

即时通信是一个终端连接一个即时通信网络的服务,具有实时、跨平台、成本低、效率高等优点。即时通讯工具发展很快,同时也存在许多不足,主要在安全性、可靠性方面,如信息泄露、易受垃圾信息攻击、ID被盗、隐私威胁、病毒威胁等等。此外,附加功能太多,如游戏、社区、电子邮件等,占据内存空间过大。签于此,开发一个简便的即时通讯工具很有必要。

网络通讯必然少不了相应的通讯协议支撑,良好的网络通讯协议,可以保证数据传输通畅。基于此,本文设计了一个简单的用以支持即时通讯的网络聊天协议。在Windows平台上基于MFC提供的编程框架,采用面向对象的思想设计,利用C++语言编写,实现客户端两两远距离通讯。

1协议设计

网络协议是指在计算机网络不同进程之间进行数据交换和信息交流而建立的规则、标准或约定的集合,包括语法、语义和时序,保证处在不同地理位置的两个或者多个相互通信的实体能够顺利完成信息识别和传输,达到通讯的目的。本文协议旨在实现开放性、安全性、可扩展性、易于开发。

1.1协议设计性能要求

1.1.1对下层协议的支持

设计协议时必须考虑下层协议,以便程序开发者根据不同的下层协议运用不同的传输手段。利用WindowsSockets网络编程接口,提供给应用程序开发者一套简单的API,设计者可充分利用Windows消息驱动机制进行编程。规范、定义并记录如何使用API与Internet协议族连接,提供相应的类CAsyncSocket和CSocket,支持流套接口和数据报套接口。利用下层的网络通讯协议功能和操作系统调用实现通讯。

1.1.2 数据保密性能

在网络上传输的数据随时可能受到非法监听、窃取、篡改或恶意破坏,需要对数据在传输过程中进行加密。端对端加密方法具有易于用软件实现、成本低的优点,本文采用此加密方法对应用层数据信息进行加密。加密时考虑因素:不让他人查看机密的数据文件;不允许机密数据被泄露或篡改;不允许特权用户(如管理员)查看私人数据文件;不允许入侵者轻易查找系统文件。本设计首先由系统自动生成6位数的秘钥,以符数组的形式存放,客户端在数据发送之前,将要发送的信息与秘钥按位异或运算,再传输出去。接收端每收到一个数据包就和数据按位异或,即可得到加密之前的信息数据,进行相应操作。

1.1.3传输可靠性

(1)数据内容检验。由于网络传输的不稳定性,根据经验大于1024byte的包和小于1024byte的包更易丢失,因此在设计时设定客户端传输的数据包均小于等于1024byte。在每次传输数据前进行数据校验,如果用户一次传输的数据大于1024byte,系统会自动将用户的数据分解成最大长度为1024byte的数据包,分多次传输,以保障可能的数据截断。

(2)数据长度校验。在数据包的数据结构定义时设定了指代传输数据实际长度的字段,每次通讯时,发送端均会传送实际的数据包长度给接收端,接收端在接收到数据包时会对数据包长度进行校验,如果正确就进行信息处理,否则丢弃数据包,并向发送端传送出错信息,发送端发现有错误就会重新传送上次发送的信息。

1.1.4协议通用性与可扩展性

在计算机网络协议设计中,由于最初设计时无法对将来技术的发展趋势、应用扩展和后期维护有精确的把握,所以设计之初必须留有冗余位,以便适应新变化。

1.1.5协议的简洁高效性

过于复杂的协议往往很难利用,简洁高效是协议的基本要求。简洁高效的协议能够给开发者或使用者留有自由空间。本设计在服务器和客户端两边都定义了相同的数据结构,相同的字段,具有相同的语义,并且只包含5个字段,达到简洁高效要求。

1.2协议设计

1.2.1协议语法设计

(1)通讯协议具体格式,包括判断消息属于哪个类型、消息发送者、消息接收者、发送数据、消息长度共5部分,

(2)协议语法设计代码片段:

typedef enum {LOGIN,LOGOUT,LOGOK,LOGERR,

SHAKE,TRANSMIT,SVRSTOP,ERR}FUN;

typedef struct NET_PACK

{FUN fun;

char senderID[28];

char RecerverID[28];

char Connect[1024];

int Len;

}NET_PACK;

1.2.2 协议语义设计

(1)fun功能标识定义为枚举类型(enum),占4个byte,共32位,声明一组命名的常数,当一个变量有几种可能取值时,可将它定义为枚举类型。在Win32机器上,枚举类型所占字节数总是4byte,在上面代码片段中sizeof(enum),sizeof(FUN),sizeof(LOGIN)都是4byte。Fun 分别包括LOGIN,LOGOUT,LOGOK,LOGERR,SHAKE,TRANSMIT,SVRSTOP,ERRL。lLOGIN 表示用户登录,LOGOUT 表示用户退出,LOGOK表示用户登录成功,LOGERR表示用户登录失败,SHAKE 表示震动,TRANSNIT 表示信息传输,SRRSTOP表示服务器停止,ERR表示数据传送出错。

(2)SenderID定义为char类型,是发送者标识,用以标记信息的来源者。

(3)RecerverID定义为char类型,是接收者标识,用以标记信息的接收者。

(4)Connect定义为char类型,装载需要传输的数据。

(5)Len定义为int类型,记录了传输数据的长度,用于发送信息长度的简单校验。如果出错,则提醒发送者传输错误,同时直接丢弃错误数据,否则转发数据给接收者。

1.2.3协议时序设计

本协议的设计目的是支持即时通讯,对发送和接收到的数据格式进行约定,以便客户端和服务器端能够顺利对通讯信息进行识别和转发,保证通讯顺利进行。所以,通讯需要满足服务器打开、客户端登录,然后才可发送、接收信息,而只有在有数据传输时协议才发挥作用。

2应用设计

2.1架构设计

应用部分采用了C/S系统架构模型,该模型一般包括服务器和客户机,服务器用来响应并为客户提供固定服务;客户机程序用来向服务器提出请求或要求某种服务。通常情况下,服务器在特定的IP地址和端口上进行监听。然后,客户端向服务器发出连接请求,服务器响应该请求则连接成功;否则,客户端连接请求失败,如图2所示。由于客户端连接服务器时,需要使用服务器的IP地址和监听端口号才能完成连接,所以服务器的IP地址和端口必须是固定的。客户端使用Socket对网络上某一服务器的某一端口发出连接请求。一旦连接成功即打开会话;会话完成后,关闭Socket。客户端不需要指定打开端口,通常临时、动态地分配一个1024以上端口。

2.2编程设计

在编程实现通讯时,利用MFC提供的类CSocket,CSocket提供的通信为同步通信,使用CSocket类进行网络编程步骤如下:①创建CSocket类对象;②创建服务器端Socket,调用Bind()函数绑定本地IP和端口,一般端口号需要大于1024,接着调用Listen()函数监听是否有客户端请求。如有,调用Accept()函数响应其请求;③创建客户端Socket,并且调用Connect()函数连接服务器;

④创建与CSocket类对象相关联的CSocketFile类对象;

⑤创建与CSocketFile类相关联的CArchive对象;⑥使用CArchive类对象在客户端和服务器之间进行数据传输;

⑦调用cloase()函数关闭连接,销毁CSocket类、CSocket-File类和CArchive类的对象。

3结语

本文系统实现了客户机在网络上的两两即时通讯,经测试效果良好,达到了设计的预期目标。系统需要改进的地方有:加密方法太简单,缺乏垃圾信息拦截设计等,这些将在后续进行改进。