017
VCSQL基于局域网的聊天程序实现样本
(样本只提供该系统的基本情况介绍,若需要完整的设计和论文,建议您购买本系统,凡是购买本站系统的,本站均根据您的要求,把系统上的开发信息,题目等修改成符合您的要求)
本设计包含内容:源代码+毕业论文
论文大概:
基于局域网聊天程序设计
摘 要:本论文讨论了Windows环境下局域网聊天程序的设计思路和设计方法。其中网络通信部分采用流行的TCP/IP协议。程序采用典型的C/S(服务器/客户端)构架。用socket编程设计网络通讯。界面设计部分采用Windows
MFC框架。数据库采用微软SQL
Server。本文最终设计了一个简易版本的聊天软件,包括登陆、退出、添加好友、消息收/发等功能。
关键词:Sockets
API,C/S构架,SQL Server。
Realization of a kind of LAN chat tool
Abstract: This article discusses how to design and develop a
LAN chatting program in Windows environment. The network
communication part depends on the popular TCP/IP protocol. Software
is based on C/S architecture. Network communication is developed
with Socket. UI is designed with Windows MFC frame. Database is
designed with SQL server. The article describes a concise chart
software version, with the function of logging in/out, adding friend
to list, sending/receiving message and so on.
Key words: Sockets
API,C/S architecture,SQL Server
论文目录
局域网聊天程序的设计 2
第一章、概述 4
第二章、WINDOWS
SOCKETS 网络编程的研究 4
2.1 TCP/IP体系结构 5
2.2.1
TCP/IP简介 5
2.2.2
TCP/IP的特点 5
2.2基本套接字 5
2.3客户机/服务器模式 7
2.4
WINDOWS SOCKETS程序设计 8
2.4.1 WINDOWS SOCKETS
API简介 8
2.4.2 WINDOWS
SOCKETS机制 9
第三章、网络通信模块分析 11
3.1
网络通信程序设计过程 11
3.2
网络通信程序设计核心 13
3.2.1通信设计代码分析 13
3.2.2数据传输代码分析 17
3.2.3出错处理 19
第四章、界面模块分析 20
4.1
服务器端界面模块分析 20
4.2
客户端界面模块分析 21
4.2.1用户登陆界面分析 21
4.2.2用户注册界面分析 22
4.2.3在线用户列表界面分析 23
4.2.4用户聊天界面分析 24
第五章、数据库模块分析 27
5.1数据库的选择 27
5.2数据库访问方法 27
5.3
ADO数据库编程 27
5.3.1 ADO与
ADO接口简介 27
5.3.2使用ADO操作SQL代码分析 28
第六章、总结 33
6.1体会和感想 33
6.2
总结 33
第七章、参考书目 34
第一章 概述
即时通讯软件的出现正在逐渐改变人们的沟通与交际方式。无论近在咫尺,还是远隔重洋,也只是在键盘和鼠标之间就可以解决问题。即时通讯服务非常适合企业内部或企业和客户之间的交流。而且将即时通讯服务和手机移动等服务结合,将更大地提高工作效率。网络聊天程序.越来越影响着我们的网络生活。
习惯了通过类似ICQ、QQ、MSN之类的程序和天南海北的朋友聊天、发信息,不过所有聊天程序都需要Internet的支持,而无法在局域网内部“大显身手”,那么你是否想到过要让单位内部的员工,寝室周围的同学,不用上Internet就可以轻松体验到内网聊天的快乐呢?有了这种想法,开发局域网聊天程序就有了必要性,让单位员工或寝室同学不出内网就能自由聊天!
本文主要研究的是一个具有高度实用性的聊天程序软件的设计原理,思路和过程。通过该网络程序的编制和实践,对自己所学习的知识进行一次综合和提高,有更深层次的理解和掌握,在这过程中激发自己学习的潜力,提高软件开发的能力,加深对网络协议和windows环境下网络编程的理解和掌握。
第二章、Windows
Socket 网络编程的研究
1.1.1 2.1 TCP/IP体系结构
1.1.1.1 2.2.1
TCP/IP简介
TCP/IP 作为
Internet的核心协议,通过近二十多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为事实上的国际标准。TCP/IP
协议集确立了 Internet 的技术基础。
TCP/IP 协议主要作用于 OSI
网络参考模型中的网络层(第3层)、传输层(第4层)和应用层(第7层)。数据链路层(第2层)的功能主要应用于其它协议如以太网(Ethernet)、ATM、帧中继(Frame
Relay),以及多数供应商特定协议等。TCP/IP 充分支持所有通用第2层协议。TCP/IP 组中的应用程序通常直接运行于传输层协议
TCP 或 UDP 上面,并不需要表示层(第6层)和会话层(第5层)的支持。
1.1.1.2 2.2.2
TCP/IP的特点
TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中设计。因此用户一般不涉及。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。前者为核内设计,后者为核外设计。用户服务要通过核外的应用程序才能设计,所以要使用套接字(socket)来设计。
1.1.2 2.2基本套接字
下面给出几个基本的套接字,这些套接字的使用贯穿了网络编程的始末,主导了数据通信的过程。这将在以后的篇幅中会给出更详细的使用说明。
1、创建套接字——socket()
功能:使用前创建一个新的套接字
格式:SOCKET
PASCAL FAR socket(int af,int type,int procotol);
参数:af:
通信发生的区域
type: 要建立的套接字类型
procotol: 使用的特定协议
2、指定本地地址——bind()
功能:将套接字地址与所创建的套接字号联系起来。
格式:int PASCAL
FAR bind(SOCKET s,const struct sockaddr FAR * name,int
namelen);
参数:s:
是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
其它:没有错误,bind()返回0,否则SOCKET_ERROR
地址结构说明:
struct
sockaddr_in
{
short sin_family;//AF_INET
u_short
sin_port;//16位端口号,网络字节顺序
struct in_addr
sin_addr;//32位IP地址,网络字节顺序
char sin_zero[8];//保留
}
3、建立套接字连接——connect()和accept()
功能:共同完成连接工作
格式:int PASCAL
FAR connect(SOCKET s,const struct sockaddr FAR * name,int
namelen);
SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR *
name,int FAR * addrlen);
参数:同上
4、监听连接——listen()
功能:用于面向连接服务器,表明它愿意接收连接。
格式:int PASCAL
FAR listen(SOCKET s, int backlog);
5、数据传输——send()与recv()
功能:数据的发送与接收
格式:int PASCAL FAR
send(SOCKET s,const char FAR * buf,int len,int flags);
int PASCAL
FAR recv(SOCKET s,const char FAR * buf,int len,int
flags);
参数:buf:指向存有传输数据的缓冲区的指针。
6、多路复用——select()
功能:用来检测一个或多个套接字状态。
格式:int PASCAL FAR
select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds,
fd_set FAR * exceptfds,const struct timeval FAR *
timeout);
参数:readfds:指向要做读检测的指针
writefds:指向要做写检测的指针
exceptfds:指向要检测是否出错的指针
timeout:最大等待时间
7、关闭套接字——closesocket()
功能:关闭套接字s
格式:BOOL
PASCAL FAR closesocket(SOCKET
s)。
1.1.3 2.3客户机/服务器模式
在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server
model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:
首先服务器方要先启动,并根据请示提供相应服务,过程如下所示:
1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。
2、等待客户请求到达该端口。
3、接收到重复服务请求,处理该请求并发送应答信号。
4、返回第二步,等待另一客户请求
5、关闭服务器。
客户方:
1、打开一通信通道,并连接到服务器所在主机的特定端口。
2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……
3、请求结束后关闭通信通道并终止。
1.1.4 2.4
WINDOWS SOCKETS程序设计
1.1.4.1 2.4.1 WINDOWS SOCKETS
API简介
VC++对网络编程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等。其中,Windows
Sockets
API是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。最早美国加州大学Berkeley分校在UNIX下为TCP/IP协议开发了一个API,这个API就是著名的Berkeley
Socket接口(套接字)。在桌面操作系统进入Windows时代后,仍然继承了Socket方法。在TCP/IP网络通信环境下,Socket数据传输是特殊的I/O,它也相当于文件描述符,具有一个类似于打开文件的函数调用-socket()。可以这样理解:Socket实际上是一个通信端点,通过它,用户的Socket程序可以通过网络和其他的Socket应用程序通信。Socket存在于一个"通信域"(为描述一般的线程如何通过Socket进行通信而引入的抽象概念)里,并且与另一个域的Socket交换数据。Socket有三类。第是SOCK_STREAM(流式),提供面向连接的可靠的通信服务,比如telnet,http。第二种是SOCK_DGRAM(数据报),提供无连接不可靠的通信,比如UDP。第三种是SOCK_RAW(原始),主要用于协议的开发和测试,支持通信底层操作,比如对IP和ICMP的直接访问。
1.1.4.2 2.4.1
WINDOWS SOCKETS机制
1、异步选择机制:
WINDOWS SOCKETS
的异步选择函数提供了消息机制的网络事件选择,当使用它登记网络事件发生时,应用程序相应窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。
WINDOWS
SOCKETS 提供了一个异步选择函数
WSAAsyncSelect(),用它来注册应用程序感兴趣的网络事件,当这些事件发生时,应用程序相应的窗口函数将收到一个消息。
函数结构如下:
int
PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long
lEvent);
参数说明:
hWnd:窗口句柄
wMsg:需要发送的消息
lEvent:事件(以下为事件的内容)
值:
含义:
FD_READ 期望在套接字上收到数据(即读准备好)时接到通知
FD_WRITE
期望在套接字上可发送数据(即写准备好)时接到通知
FD_OOB 期望在套接字上有带外数据到达时接到通知
FD_ACCEPT
期望在套接字上有外来连接时接到通知
FD_CONNECT 期望在套接字连接建立完成时接到通知
FD_CLOSE
期望在套接字关闭时接到通知
例如:我们要在套接字读准备好或写准备好时接到通知,语句如下:
rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);
如果我们需要注销对套接字网络事件的消息发送,只要将
lEvent 设置为0 。
2、异步请求函数
在 Berkeley Sockets 中请求服务是阻塞的,WINDOWS SICKETS
除了支持这一类函数外,还增加了相应的异步请求函数(WSAAsyncGetXByY();)。
3、阻塞处理方法
WINDOWS SOCKETS
为了设计当一个应用程序的套接字调用处于阻塞时,能够放弃CPU让其它应用程序运行,它在调用处于阻塞时便进入一个叫“HOOK”的例程,此例程负责接收和分配WINDOWS消息,使得其它应用程序仍然能够接收到自己的消息并取得控制权。
WINDOWS
是非抢先的多任务环境,即若一个程序不主动放弃其控制权,别的程序就不能执行。因此在设计 WINDOWS SOCKETS
程序时,尽管系统支持阻塞操作,但还是反对程序员使用该操作。但由于 SUN 公司下的 Berkeley Sockets
的套接字默认操作是阻塞的,WINDOWS 作为移植的 SOCKETS 也不可避免对这个操作支持。
在 WINDOWS
SOCKETS 设计中,对于不能立即完成的阻塞操作做如下处理:DLL初始化→循环操作。在循环中,它发送任何 WINDOWS
消息,并检查这个 WINDOWS SOCKETS
调用是否完成,在必要时,它可以放弃CPU让其它应用程序执行(当然使用超线程的CPU就不会有这个麻烦了)。我们可以调用
WSACancelBlockingCall() 函数取消此阻塞操作。
在 WINDOWS SOCKETS
中,有一个默认的阻塞处理例程 BlockingHook() 简单地获取并发送 WINDOWS
消息。如果要对复杂程序进行处理,WINDOWS SOCKETS 中还有WSASetBlockingHook()
提供用户安装自己的阻塞处理例程能力;与该函数相对应的则是
SWAUnhookBlockingHook(),它用于删除先前安装的任何阻塞处理例程,并重新安装默认的处理例程。请注意,设计自己的阻塞处理例程时,除了函数WSACancelBlockingHook()
之外,它不能使用其它的 WINDOWS SOCKETS API 函数。在处理例程中调用
WSACancelBlockingHook()函数将取消处于阻塞的操作,它将结束阻塞循环。
4、出错处理
WINDOWS SOCKETS
为了和以后多线程环境(WINDOWS/UNIX)兼容,它提供了两个出错处理函数来获取和设置当前线程的最近错误号。(WSAGetLastEror()和WSASetLastError())
5、启动与终止
使用函数 WSAStartup() 和 WSACleanup() 启动和终止套接字。
第四章、界面模块分析
1.1.5 4.1服务器端界面模块分析
服务器端界面如图2所示
图2
服务器界面
如图2所示,在服务器界面设计上设计很简单,通过一个列表框来显示服务器信息,一个启动按钮来启动服务器,一个退出按钮关闭服务器。
如果服务器启动没有什么问题就会在列表框中显示“
创建服务器成功”字样。
当用户登陆,就会在列表框中显示如“127.0.0.1 连接,接受127.0.0.1:USER
1001,接受127.0.0.1:PASS
1001”三行字样,如果登陆成功,在列表框中就会显示“接受127.0.0.1:LIST”字样,获取在线用户列表。如果登陆失败,在列表框中就会显示如“127.0..0.1断开”字样。
在注册用户的时候,如果注册成功,在列表框中就会显示如“ADD
USER 1001 SUCCESS”,如果失败,就会在列表框中显示“ADD USER
FAIL”
当修改用户信息的时候就会在列表框中显示“接受127.0.0.1:GINF
1001”,如果修改成功,就会在列表框中显示“接受127.0.0.1:UINF
1001”。
1.1.6 4.2客户端界面模块分析
客户端界面主要包括用户登陆界面、用户注册界面、在线用户列表界面、用户聊天界面。
其中客户端界面设计思路,主要设计过程如图3所示:
图3
客户端界面轮廓
1.1.6.1 4.2.1用户登陆界面分析
用户登陆界面如图4所示
图4
用户登陆界面
如图4显示,当单击“登陆”按钮进行用户的登陆:
当用户号码未填写时,会提示“请输入用户号码”。
当用户密码未填写时,会提示“请输入用户密码”。
当服务器IP未填写或格式不正确,会提示“请填写正确的服务器地址”。
勾选“保护密码”,在下次打开该登陆界面时,在输入框里自动显示上次登陆时输入的三项信息。
用户信息填写完毕后,按“登陆”按钮,如果与服务器连接失败,就会提示如“连接失败:不能连接192.0.0.1上的服务器”
登陆成功就会进入在线用户列表界面,如图6所示.。
单击“取消”按钮退出登陆界面。
单击“注册向导”按钮就可以进入用户注册界面,如图5所示。
1.1.6.2 4.2.2用户注册界面分析
如图4所示,单击“注册向导”按钮,进入用户注册界面。如图5所示
图5 用户注册界面
所有信息都必须填写,当某项信息未填时,会提示“请输入XXX”,并在同时将“用户密码”和“确认密码”二栏内容清空。
当点击“注册”按钮时,如果注册成功,提示“注册成功,你的用户号码是XXXX!”
如果注册失败,若是服务器未启动或连接失败,则会提示“注册失败,服务器未启动或连接失败。”
单击“取消”按钮,返回登陆界面。
1.1.6.3 4.3在线用户列表界面分析
如图4所示,当登陆成功时进入在线用户列表界面,如图6所示。
图6 在线用户列表界面
当单击自己用户号码时,在列表下显示“修改”按钮,单击该按钮,显示图7所示的自己的用户信息并可以进行修改。
图7 修改用户资料界面
能修改的所有内容格式必须正确而且不能未空,否则单击“修改”后会提示“修改没有成功!”修改成功就会提示“修改成功”,但不管成功与否,都会返回用户列表界面,单击用户列表界面的“刷新”按钮,如果修改成功,其中被修改的信息会改变。单击取消按钮,返回用户列表界面
当单击其他用户号码时,在列表下显示“查看”按钮,单击该按钮,显示如图8所示的其他用户信息。
图8 用户信息查看界面
其他用户的所有信息都不能修改,你可以单击“加为好友”按钮来增加好友。添加成功后会提示“增加好友成功”,否则提示“增加好友失败”。单击“取消”按钮返回在线用户列表界面。
如图6所示,单击“进入聊天”按钮,可以进入用户聊天界面,如图9所示。
1.1.6.4 4.2.4用户聊天界面分析
用户聊天界面如图9所示
图9 用户聊天界面