局域网通信工具开发中的核心技术解析
2014-12-25张永来
张永来
(四川师范大学信息技术学院,四川 成都610068)
0 概述
局域网通信工具是一个局域网内部常用的通信工具,最典型的就是一般公司常用的飞秋。局域网通信工具一般要求具有的主要功能有一对一聊天、群聊、一对一传文件。如何设计整个系统的功能与结构,怎么实现这些通信等等是在开发过程中涉及到的主要问题,以达到功能需求并提高整体性能。
1 统框架设计
局域网通信工具主要功能包括三个:单聊、群聊和传文件。通信模式分为两种:C/S模式和B/S模式,本文采用C/S模式,即客户端/服务器模式,在一个局域网中设一台服务器和若干台客户端机器。而客户端与服务器中间的通信有两种方式:一、所有客户端之间的通信信息都经过服务器进行转发。此结构的优点是可以在服务器中控制整个通信过程和记录通信信息,缺点是:服务器负担较重,对服务器性能要求较后者高。二、服务器只起到管理客户端的作用,三种功能的实现是在客户端之间传送通信信息,不通过服务器进行转发。此结构的优点是:服务器负担较前者轻,对服务器性能要求不高,缺点是:通信信息不经过服务器进行转发,服务器不能控制整个通信过程,也不能记录通信信息。
综合考虑以上两个结构的优缺点,结合局域网通信的特点,聊天记录通常需要查阅,为了更好地保存聊天记录、监控聊天内容,单聊和群聊信息需要通过服务器进行中转;而文件传输实时性要求较高,为了提高文件传输速度,传文件功能不通过服务器进行中转,而是直接在客户端之间完成,服务器为并发服务器[1],结构图如图1。
图1 本文采用的通信结构
2 关键技术研究
2.1 关键技术概述
整个系统的开发过程涉及到的核心技术有MFC界面技术[2]、多线程及其同步技术、网络通信技术及数据库连接技术。限于篇幅,本文重点结合实践介绍核心技术中的关键技术:网络通信与多线程及其同步技术。
2.2 多线程及其同步技术[3]
2.2.1 多线程概念、思想及用法
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,即同一时间内完成多个任务,进而提升整体处理性能。线程创建函数CreateThread的用法如下,本文用法见代码部分。
核心接口函数:CreateThread的函数功能是创建线程,其函数原型为:
HANDLEWINAPICreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
函数说明:
第一个参数lpThreadAttributes表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
第二个参数dwStackSize表示线程栈空间大小。传入0表示使用默认大小(1MB)。
第三个参数lpStartAddress表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
第四个参数lpParameter是传给线程函数的参数。
第五个参数dwCreationFlags指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
第六个参数lpThreadId将返回线程的ID号,传入NULL表示不需要返回该线程ID号。
函数返回值:
成功返回新线程的句柄,失败返回NULL。
2.2.2 线程同步技术
同一个进程中的多线程技术通常要结合同步技术实现,因为一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。同步就是协同步调,按预定的先后次序进行运行。线程同步方式主要有四种:临界区、互斥量、事件、信号量[4]四种方式。本文中主要结合事件对象方式阐述线程与线程同步的应用。
事件对象使用的核心接口函数:CreateEvent的函数功能是创建事件对象,其函数原型为:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTESlpEventAttributes,
BOOL bManualReset,
BOOL InitialState,
LPTSTR lpName);
第一个参数lpEventAttributes一般忽略不管。
第二个参数bManualReset参数表示事件对象是自动类型的还是手动类型的,true表示手动类型,必须使用ResetEvent使其处于无信号状态;false表示自动类型,不需要使用ResetEvent而被获取后自动处于无信号状态。
第三个参数InitialState参数表示该事件对象创建后是否处于有信号状态,即是否可被线程获取而使线程具有运行权。
第四个参数lpName参数表示事件对象的名称,可以为任意合法字符串。
2.3 网络通信技术
网络通信模型中的传输层主要有两种协议:TCP协议和UDP协议。TCP协议优点是面向连接的可靠传输,缺点是通信期间始终保持连接,系统性能下降,适用于通信量集中且通信量较大的情况。UDP协议为无连接的不可靠传输,优点是不影响系统性能,适用于通信不定时且通信量不大的情况。而网络通信中常用的核心接口socket就是基于这两种协议[5-6]。两种通信方式的过程如图2和图3。
图2 UDP传输模型
图3 TCP传输模型
3 代码讲解
}//以上完成套接字库的加载
get_msg_socket=socket(AF_INET,SOCK_DGRAM,0);//创建一个UDP数据包套接字
4 结论
本文详述了局域网通信工具的框架及实现的关键技术,其中系统框架的设计思想比较适合实际应用,实现过程中使用了多线程及其同步技术,较好地达到了服务器端的要求,系统功能较为全面。界面还不够美观,有待完善。
[1]王枫,罗家荣.Linux下多线程Socket通讯的研究与应用[J].计算机工程与应用,2004,16:106-109.
[2]孙鑫.VC++深入详解(修订版)[M].北京:电子工业出版社,2012:1-307.
[3]骆斌,费翔林.多线程技术的研究与应用[J].计算机研究与发展,2000,37,(4):407-412.
[4]陈少强.VC中基于MFC的多线程应用程序设计[J].三明高等专科学校学报,2002,19(2):49-55.
[5][韩]尹圣雨.TCP/IP网络编程[M].金国哲,译.北京:人民邮电出版社,2014:1-242.
[6]刘烨.用Socket实现基于TCP和UDP的原理探索[J].电脑学习,2009(3):6-8.