1、基于局域网聊天程序设计摘要:本论文讨论了Windows环境下局域网聊天程序的设计思路和设计方法。其中网络通信部分采用流行的TCP/IP协议。程序采用典型的C/S(服务器/客户端)构架。用socket编程设计网络通讯。界面设计部分采用Windows MFC框架。数据库采用微软SQL Server。本文最终设计了一个简易版本的聊天软件,包括登陆、退出、添加好友、消息收/发等功能。关键词:Sockets API,C/S构架,SQL Server。Realization of a kind of LAN chat toolAbstract: This article discusses how to
2、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.
3、 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 网络编程的研究42.1 TCP/IP体系结构52.2.1 TCP/IP简介52.2.2 TCP/IP的特点
4、52.2基本套接字52.3客户机/服务器模式72.4 WINDOWS SOCKETS程序设计82.4.1 WINDOWS SOCKETS API简介82.4.2 WINDOWS SOCKETS机制9第三章、网络通信模块分析113.1 网络通信程序设计过程113.2 网络通信程序设计核心133.2.1通信设计代码分析133.2.2数据传输代码分析173.2.3出错处理19第四章、界面模块分析204.1 服务器端界面模块分析204.2 客户端界面模块分析214.2.1用户登陆界面分析214.2.2用户注册界面分析224.2.3在线用户列表界面分析234.2.4用户聊天界面分析24第五章、数据库模块
5、分析275.1数据库的选择275.2数据库访问方法275.3 ADO数据库编程275.3.1 ADO与ADO接口简介275.3.2使用ADO操作SQL代码分析28第六章、总结336.1体会和感想336.2 总结33第七章、参考书目34第一章 概述即时通讯软件的出现正在逐渐改变人们的沟通与交际方式。无论近在咫尺,还是远隔重洋,也只是在键盘和鼠标之间就可以解决问题。即时通讯服务非常适合企业内部或企业和客户之间的交流。而且将即时通讯服务和手机移动等服务结合,将更大地提高工作效率。网络聊天程序.越来越影响着我们的网络生活。习惯了通过类似ICQ、QQ、MSN之类的程序和天南海北的朋友聊天、发信息,不过所
6、有聊天程序都需要Internet的支持,而无法在局域网内部“大显身手”,那么你是否想到过要让单位内部的员工,寝室周围的同学,不用上Internet就可以轻松体验到内网聊天的快乐呢?有了这种想法,开发局域网聊天程序就有了必要性,让单位员工或寝室同学不出内网就能自由聊天!本文主要研究的是一个具有高度实用性的聊天程序软件的设计原理,思路和过程。通过该网络程序的编制和实践,对自己所学习的知识进行一次综合和提高,有更深层次的理解和掌握,在这过程中激发自己学习的潜力,提高软件开发的能力,加深对网络协议和windows环境下网络编程的理解和掌握。第二章、Windows Socket 网络编程的研究2.1 T
7、CP/IP体系结构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 或
8、 UDP 上面,并不需要表示层(第6层)和会话层(第5层)的支持。2.2.2 TCP/IP的特点TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中设计。因此用户一般不涉及。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。前者为核内设计,后者为核外设计。用户服务要通过核外的应用程序才能设计,所以要使用套接字(socket)来设计。2.2基本套接字下面给出几个基本的套接字,这些套接字的使用贯穿了网络编程的始末,主导了数据通信的过程。这将在以后的篇幅中会给出更详细的使用说明。1、创建
9、套接字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()
10、返回0,否则SOCKET_ERROR地址结构说明:struct sockaddr_inshort sin_family;/AF_INETu_short sin_port;/16位端口号,网络字节顺序struct in_addr sin_addr;/32位IP地址,网络字节顺序char sin_zero8;/保留3、建立套接字连接connect()和accept()功能:共同完成连接工作格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);SOCKET PASCAL FAR accept(
11、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
12、 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、关闭套接字closesoc
13、ket()功能:关闭套接字s格式:BOOL PASCAL FAR closesocket(SOCKET s)。2.3客户机/服务器模式在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:首先服务器方要先启动,并根据请示提供相应服务,过程如下所示:1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。2、等待客户请求到达该端口。3、接收到重复服务请求,处理该请求并发送应答信号。4、返回第二步,等待另一客
14、户请求5、关闭服务器。客户方:1、打开一通信通道,并连接到服务器所在主机的特定端口。2、向服务器发送服务请求报文,等待并接收应答;继续提出请求3、请求结束后关闭通信通道并终止。2.4 WINDOWS SOCKETS程序设计2.4.1 WINDOWS SOCKETS API简介VC+对网络编程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等。其中,Windows Sockets API是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。最早美国加州大学Berkeley分校在UNIX下为TCP/IP协议开发了一个API,这个API就是著名的Berkel
15、ey Socket接口(套接字)。在桌面操作系统进入Windows时代后,仍然继承了Socket方法。在TCP/IP网络通信环境下,Socket数据传输是特殊的I/O,它也相当于文件描述符,具有一个类似于打开文件的函数调用-socket()。可以这样理解:Socket实际上是一个通信端点,通过它,用户的Socket程序可以通过网络和其他的Socket应用程序通信。Socket存在于一个通信域(为描述一般的线程如何通过Socket进行通信而引入的抽象概念)里,并且与另一个域的Socket交换数据。Socket有三类。第是SOCK_STREAM(流式),提供面向连接的可靠的通信服务,比如telne
16、t,http。第二种是SOCK_DGRAM(数据报),提供无连接不可靠的通信,比如UDP。第三种是SOCK_RAW(原始),主要用于协议的开发和测试,支持通信底层操作,比如对IP和ICMP的直接访问。2.4.1 WINDOWS SOCKETS机制1、异步选择机制:WINDOWS SOCKETS 的异步选择函数提供了消息机制的网络事件选择,当使用它登记网络事件发生时,应用程序相应窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。WINDOWS SOCKETS 提供了一个异步选择函数 WSAAsyncSelect(),用它来注册应用程序感兴趣的网络事件,当这些事件发生时
17、,应用程序相应的窗口函数将收到一个消息。函数结构如下: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 期望在套接字连接建立完成时接
18、到通知FD_CLOSE 期望在套接字关闭时接到通知例如:我们要在套接字读准备好或写准备好时接到通知,语句如下:rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);如果我们需要注销对套接字网络事件的消息发送,只要将 lEvent 设置为0 。2、异步请求函数在 Berkeley Sockets 中请求服务是阻塞的,WINDOWS SICKETS 除了支持这一类函数外,还增加了相应的异步请求函数(WSAAsyncGetXByY();)。 3、阻塞处理方法WINDOWS SOCKETS 为了设计当一个应用程序的套接字调用处于阻塞时,能够放弃CPU让其它应用
19、程序运行,它在调用处于阻塞时便进入一个叫“HOOK”的例程,此例程负责接收和分配WINDOWS消息,使得其它应用程序仍然能够接收到自己的消息并取得控制权。WINDOWS 是非抢先的多任务环境,即若一个程序不主动放弃其控制权,别的程序就不能执行。因此在设计 WINDOWS SOCKETS 程序时,尽管系统支持阻塞操作,但还是反对程序员使用该操作。但由于 SUN 公司下的 Berkeley Sockets 的套接字默认操作是阻塞的,WINDOWS 作为移植的 SOCKETS 也不可避免对这个操作支持。在 WINDOWS SOCKETS 设计中,对于不能立即完成的阻塞操作做如下处理:DLL初始化循环
20、操作。在循环中,它发送任何 WINDOWS 消息,并检查这个 WINDOWS SOCKETS 调用是否完成,在必要时,它可以放弃CPU让其它应用程序执行(当然使用超线程的CPU就不会有这个麻烦了)。我们可以调用 WSACancelBlockingCall() 函数取消此阻塞操作。在 WINDOWS SOCKETS 中,有一个默认的阻塞处理例程 BlockingHook() 简单地获取并发送 WINDOWS 消息。如果要对复杂程序进行处理,WINDOWS SOCKETS 中还有WSASetBlockingHook() 提供用户安装自己的阻塞处理例程能力;与该函数相对应的则是 SWAUnhookB
21、lockingHook(),它用于删除先前安装的任何阻塞处理例程,并重新安装默认的处理例程。请注意,设计自己的阻塞处理例程时,除了函数WSACancelBlockingHook() 之外,它不能使用其它的 WINDOWS SOCKETS API 函数。在处理例程中调用 WSACancelBlockingHook()函数将取消处于阻塞的操作,它将结束阻塞循环。4、出错处理WINDOWS SOCKETS 为了和以后多线程环境(WINDOWS/UNIX)兼容,它提供了两个出错处理函数来获取和设置当前线程的最近错误号。(WSAGetLastEror()和WSASetLastError())5、启动与终
22、止使用函数 WSAStartup() 和 WSACleanup() 启动和终止套接字。第三章、网络通信模块分析3.1网络通信程序设计过程在调用了Windows sockets 的启动函数WSACleanup()之后才能进行其他的Socket系统调用,但启动函数WSAStartup()是为了建立与Windows Sockets DLL的连接,因此在VC+6.0所建立工程的工程设置中的连接的库模块必须进行设置,在其中的link栏内的对象/库模块中加入“Ws2_32.lib”,才能真正建立建立与Windows Sockets DLL的连接。其他的Socket系统调用包括创建Socket、将创建的So
23、cket与本地端口绑定、建立Socket连接服务器、监听是否有连接、请求数据的可控缓冲发送和可控缓冲接收,到最后关闭Socket。具体流程图如1所示。 首先在服务器方,利用socket()函数建立流式套接字,返回套接字号s,接着利用bind()函数将套接字s与本地地址绑定,紧接着利用listen(0函数通知TCP,监听客户方,服务器准备接收连接,没有连接的话,服务器方通过closesocket()关闭套接字s,服务结束。有连接的话,在客户方,通过socket()函数建立流式套接字s,此时在服务器方,建立连接,通过accept()返回,得到新的套接字ns,客户方通过connect()将套接字s与
24、远程地址连接,此时服务器方/客户方在ns/s上读/写数据,直到交换完成。交换完成后,服务器方/客户方关闭套接字ns/s,最后服务器方通过closesocket()关闭最初套接字s,服务结束。具体设计过程如图1所示,具体设计代码将会在下面介绍:服务器方Socket()建立流式接字,返回套接字号s客户方bind()套接字s与本地地址绑定listen()通知TCP服务器准备接收连接accept()接收连接,等待客户端的连接建立连接,accept()返回,得到新套接nsRecv()/send()在ns上读/写数据,直到完成交换closesocket(),关闭套接字nsclosesocket()关闭最初
25、套接字s,服务结束Socket()建立流式套接字号sconnect()将套接字s与远程地址连接Recv()/send()在s上读/写数据,直到完成交换closesocket()关闭套接字s,结束TCP图1 面向连接的套接字的系统调用流程图3.2网络通信程序设计核心代码分析3.2.1通信设计代码分析先分析服务器端。首先定义初始化网络函数,也就是WINDOWS SOCKETS的启动在所有 WINDOWS SOCKETS 函数中,只有启动函数 WSAStartup() 和终止函数 WSACleanup() 是必须使用的。启动函数必须是第一个使用的函数,而且它允许指定 WINDOWS SOCKETS
26、API 的版本,并获得 SOCKETS的特定的一些技术细节。本结构如下: int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);其中 wVersionRequested 保证 SOCKETS 可正常运行的 DLL 版本,如果不支持,则返回错误信息。设计代码如下,主要是进行 WSAStartup()函数 的调用 WORD wVersionRequested;/ 定义版本信息变量 WSADATA wsaData;/定义数据信息变量 int err;/定义错误号变量 wVersionRequested = MAK
27、EWORD(1,1);/给版本信息赋值 err = WSAStartup(wVersionRequested, &wsaData);/给错误信息赋值 if(err!=0) return;/告诉用户找不到合适的版本 /确认 WINDOWS SOCKETS DLL 支持 1.1 版本 /DLL 版本可以高于 1.1 /系统返回的版本号始终是最低要求的 1.1,即应用程序与DLL 中可支持的最低版本号 if(LOBYTE(wsaData.wVersion)!= 1| HIBYTE(wsaData.wVersion)!=1) WSACleanup();/告诉用户找不到合适的版本 return; /WI
28、NDOWS SOCKETS DLL 被进程接受,可以进入下一步操作既然启动了到最后就需要调用WSACleanup()函数来终止, 关闭函数使用时,任何打开并已连接的 SOCK_STREAM 套接字被复位,但那些已由 closesocket() 函数关闭的但仍有未发送数据的套接字不受影响,未发送的数据仍将被发送。程序运行时可能会多次调用 WSAStartuo() 函数,但必须保证每次调用时的 wVersionRequested 的值是相同的。接着是创建服务器端套接字,主要代码如下:SOCKET ServerSock; /服务器端SocketServerSock = socket(AF_INET,
29、 SOCK_STREAM, IPPROTO_TCP);if(ServerSock = INVALID_SOCKET)MessageBox(创建套接字失败!);closesocket(ServerSock);WSACleanup();return FALSE;套接字创建好之后就是与本地地址绑定:sockaddr_in localaddr;localaddr.sin_family = AF_INET;localaddr.sin_port = htons(8888); file:/端口号不要与其他应用程序冲突localaddr.sin_addr.s_addr = 0;if(bind(ServerSo
30、ck ,(struct sockaddr*)&localaddr,sizeof(sockaddr)= = SOCKET_ERROR)MessageBox(绑定地址失败!);closesocket(ServerSock);WSACleanup();return FALSE;接下来就是对SOCKET的设置,本程序使用的数据传输模式是异步非阻塞模式,设置好之后就是监听客户端信息,主要代码如下if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT,FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) = SOCKET_ER
31、ROR)MessageBox(注册网络异步事件失败!);WSACleanup();return FALSE;listen(ServerSock, 5); /设置侦听模式return TRUE;其中m_hWnd 为应用程序的主对话框或主窗口的句柄。这就要说到网络异步函数的回调函数,主要代码内容如下:OnNetEvent(WPARAM wParam, LPARAM lParam)/调用Winsock API函数,得到网络事件类型int iEvent = WSAGETSELECTEVENT(lParam);/调用Winsock API函数,得到发生此事件的客户端套接字SOCKET CurSock=
32、(SOCKET)wParam;switch(iEvent)case FD_ACCEPT: /客户端连接请求事件OnAccept(CurSock);break;case FD_CLOSE: /客户端断开事件:OnClose(CurSock);break;case FD_READ: /网络数据包到达事件OnReceive(CurSock);break;case FD_WRITE: /发送网络数据事件OnSend(CurSock);break;default: break;另外,发生在相应Socket上的各种网络异步事件的处理函数,其中OnAccept传进来的参数是服务器端创建的套接字,OnClos
33、e()、OnReceive()和OnSend()传进来的参数均是服务器端在接受客户端连接时新创建的用与此客户端通信的Socket。定义OnAccept()函数来接受连接请求,并保存与发起连接请求的客户端进行通信Socket,为新的socket注册异步事件;定义OnSend()函数来给客户端发数据时做相关预处理; 定义OnReceive()函数来读出网络缓冲区中的数据包;定义OnClose()函数来结束与相应的客户端的通信,释放相应资源。接下来讲讲客户端方。首先初始化网络部分,带不需要将套接字设置为监听模式。注册异步事件时,没有FD_ACCEPT,但增加了FD_CONNECT事件,因此没有OnA
34、ccept()函数,但增加了OnConnect()函数。向服务器发出连接请求时,使用connect()函数,连接成功后,会响应到OnConnect()函数中。下面是OnConnect()函数的定义,传进来的参数是客户端Socket和服务器端发回来的连接是否成功的标志。void CXFQQClientDlg:OnConnect(SOCKET CurSock, int error)if(0 = = error)if(CurSock = = ClntSock)MessageBox(连接服务器成功!); 另外定义OnReceive()函数来处理网络数据到达事件;定义OnSend()函数来处理发送网络数
35、据事件;定义OnClose()函数来处理服务器的关闭事件。3.2.2数据传输代码分析在服务器方用 WSASend()函数来发送数据,使用 WSARecv()来接收数据。Windows Sockets 不鼓励用户使用阻塞方式传输数据,因为那样可能会阻塞整个 Windows 环境。发送数据主要代码如下所示:if (WSASend(pSI-s, &(pSI-wsaBuf), 1,&dwSendBytes, 0,&(pSI-o), NULL) = SOCKET_ERROR) if (WSAGetLastError() != ERROR_IO_PENDING) PrintSystemError(WSAS
36、end()失败);/自定义出错显示函数return -1; 其中pSI的类型是自定义的网络信息结构,包含网络的所有信息。结构定义如下:typedef structchar buffRecvDATA_BUFSIZE;char buffSendDATA_BUFSIZE;WSABUF wsaBuf;/ 指向WSABUF结构数组的指针SOCKET s;/ 标识一个已连接套接口的描述字。WSAOVERLAPPED o;/ 指向WSAOVERLAPPED结构的指针DWORD dwBytesSend;DWORD dwBytesRecv;int nStatus;char ip16;BOOL bLoggedIn
37、;SOCKET_INF,*LPSOCKET_INF; 若无错误发生且发送操作立即完成,则WSASend()函数返回所发送的字节数。(注意该数目可能小于len参数所指定的值)。如果连接结束,则返回0。请注意在这种情况下完成指示(启动指定的完成例程或设置一个事件对象)将早已发生。否则的话,将返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()来获取相应的错误代码,返回-1。错误代码WSA_IO_PENDING表示重叠操作成功启动,过后将有完成指示。任何其他的错误表示重叠操作未能成功地启动,以后也不会有完成指示。服务器方接收数据代码如下:if (WSARecv(pSI-
38、s, &(pSI-wsaBuf), 1, &dwRecvBytes, &dwFlags,&(pSI-o), NULL) = SOCKET_ERROR)if (WSAGetLastError() != ERROR_IO_PENDING)PrintSystemError(WSARecv()失败);return -1;若无错误发生且接收操作立即完成,则WSARecv()函数返回所接收的字节数。如果连接结束,则返回0。请注意在这种情况下完成指示(启动指定的完成例程或设置一个事件对象)将早已发生。否则的话,将返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()来获取相应的错
39、误代码。错误代码WSA_IO_PENDING表示重叠操作成功启动,过后将有完成指示。任何其他的错误表示重叠操作未能成功地启动,以后也不会有完成指示。在客户方,利用send()和recv()来发送和接收消息,发送代码如下: if(send(m_cliSocket,buff,sizeof(buff),0) = SOCKET_ERROR)closesocket(m_cliSocket);return;若无错误发生,send()返回所发送数据的总数(请注意这个数字可能小于len中所规定的大小)。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码
40、。接收代码如下:if(recv(cliSock,buff,sizeof(buff),0) = SOCKET_ERROR)closesocket(cliSock);return FALSE;若无错误发生,recv()返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。3.2.4出错处理自定义PrintSystemError函数来显示错误信息,编写方式如下: void PrintSystemError(CString str)char strSystemError40;CXFQQServerDlg
41、*dlg=(CXFQQServerDlg*) AfxGetApp()-GetMainWnd();memset(strSystemError,0,sizeof(strSystemError);sprintf(strSystemError,系统:%s,str);dlg-m_list.InsertString(g_dwListCount+, strSystemError);dlg-m_list.SetTopIndex(g_dwListCount-1);第四章、界面模块分析4.1服务器端界面模块分析服务器端界面如图2所示图2 服务器界面如图2所示,在服务器界面设计上设计很简单,通过一个列表框来显示服务
42、器信息,一个启动按钮来启动服务器,一个退出按钮关闭服务器。如果服务器启动没有什么问题就会在列表框中显示“ 创建服务器成功”字样。当用户登陆,就会在列表框中显示如“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
43、”当修改用户信息的时候就会在列表框中显示“接受127.0.0.1:GINF 1001”,如果修改成功,就会在列表框中显示“接受127.0.0.1:UINF 1001”。4.2客户端界面模块分析客户端界面主要包括用户登陆界面、用户注册界面、在线用户列表界面、用户聊天界面。其中客户端界面设计思路,主要设计过程如图3所示:用户登陆用户注册获得在线用户用户聊天消息收/发文件收/发增加好友查看/修改信息图3 客户端界面轮廓4.2.1用户登陆界面分析用户登陆界面如图4所示图4 用户登陆界面如图4显示,当单击“登陆”按钮进行用户的登陆:当用户号码未填写时,会提示“请输入用户号码”。当用户密码未填写时,会提示
44、“请输入用户密码”。当服务器IP未填写或格式不正确,会提示“请填写正确的服务器地址”。勾选“保护密码”,在下次打开该登陆界面时,在输入框里自动显示上次登陆时输入的三项信息。用户信息填写完毕后,按“登陆”按钮,如果与服务器连接失败,就会提示如“连接失败:不能连接192.0.0.1上的服务器”登陆成功就会进入在线用户列表界面,如图6所示.。单击“取消”按钮退出登陆界面。单击“注册向导”按钮就可以进入用户注册界面,如图5所示。4.2.2用户注册界面分析如图4所示,单击“注册向导”按钮,进入用户注册界面。如图5所示 图5 用户注册界面所有信息都必须填写,当某项信息未填时,会提示“请输入XXX”,并在同
45、时将“用户密码”和“确认密码”二栏内容清空。当点击“注册”按钮时,如果注册成功,提示“注册成功,你的用户号码是XXXX!”如果注册失败,若是服务器未启动或连接失败,则会提示“注册失败,服务器未启动或连接失败。”单击“取消”按钮,返回登陆界面。4.3在线用户列表界面分析如图4所示,当登陆成功时进入在线用户列表界面,如图6所示。图6 在线用户列表界面 当单击自己用户号码时,在列表下显示“修改”按钮,单击该按钮,显示图7所示的自己的用户信息并可以进行修改。图7 修改用户资料界面能修改的所有内容格式必须正确而且不能未空,否则单击“修改”后会提示“修改没有成功!”修改成功就会提示“修改成功”,但不管成功与否,都会返回用户列表界面,单击用户列表界面的“刷新”按钮,如果修改成功,其中被修改的信息会改变。单击取消按钮,返回用户列表界面当单击其他用户号码时,在列表下显示“查看”按钮,单击该按钮,显示如图8所示的其他用户信息。 图8 用户信息查看界面其他用户的所有信息都不能修改,你可以单击“加为好友”按钮来增加好友。添加成功后会提示“增加好友成功”,否则提示“增加好友失败”。单击“取消”按钮返回在线用户列表界面。如图6所示,单击“进入聊天”按钮,可以进入用户聊天界面,如图9所示。4.2.4用户聊天界面分析用户聊天界面如
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922