VC聊天程序设计步骤_第1页
VC聊天程序设计步骤_第2页
VC聊天程序设计步骤_第3页
VC聊天程序设计步骤_第4页
VC聊天程序设计步骤_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验 4聊天程序【实验目的】熟悉VisualC+的基本操作。基本了解基于对话框的 windows 应用程序的编写过程。对于Windows Socket编程建立初步概念。【实验要求】 应用Visual C+中MFC CSocket类,实现网络数据传输。 仿照本实验步骤,制作实用的局域网一对一聊天程序。 【实验原理】一、Windows Socket和套接口的基本概念网际协议(In ternet Protocol, IP )是一种用于互联网的网络协议,已广为 人知。它可广泛用于大多数计算机操作系统上,也可用于大多数局域网LAN (比如办公室小型网络)和广域网WAN (比如说互联网)。从它的设计看来,

2、IP是一个无连接的协议,并不能保证数据投递万无一失。两个上层协议(TCP和UDP) 依赖 IP 协议进行数据通信。如果希望在 Microsoft Windows 下通过 TCP 和 UDP 协议建立网络应用程 序,则需要使用 Winsock 套接口编程技术。套接口,就是一个指向传输提供者的句柄。 Win32中,套接口不同于文件描 述符,所以它是一个独立的类型 SOCKET。Windows Sockets描述定义了一 个 Microsoft Windows 的网络编程界面,它是从 Unix Socket 的基础上发展而来 的,为 Windows TCP/IP提供了一个 BSD型的套接字规范,除与

3、 4.3BSD Unix Sockets完全兼容外,还包括一个扩充文件,通过一组附加的 A PI实现 Windows 式(即事件驱动)的编程风格;而 Win sock则是在Microsoft Win dows中进行网络 应用程序设计的接口。 Windows 在 Internet 支配域中的 TCP/IP 协议定义了 Win sock网络编程规范,融入了许多新特点。使用Socket的目的是使用户在网络 协议上工作而不必对该网络协议有非常深入的了解。 此外,编写的程序还可被迅 速地移植到任何支持Socket的网络系统中去。Winsock 提供了一种可为指定传输协议打开、计算和关闭会话的能力。在 W

4、indows 下, TCP/IP 上层模型在很大程度上与用户的 Winsock 应用有关;换言 之,用户的Win sock应用控制了会话的方方面面,必要时,还会根据程序的需要 格式化数据。套接口有三种类型:流式套接口、数据报套接口及原始套接口。流式套接口定义了一种可靠的面向连接的服务(利用TCP协议),实现了无差错无重复的顺序数据传输。数据报套接口定义了一种无连接的服务( UDP 协 议),数据通过相互独立的报文进行传输, 是无序的, 并且不保证可靠和无差错。 原始套接口允许对低层协议如 IP 或 ICMP 直接访问,主要用于新的网络协议实 现的测试等。面向连接服务器处理的请求往往比较复杂,

5、不是一来一去的请求应答所能解 决的,而且往往是并发服务器。 使用面向连接的套接口编程, 可以通过图 1.1 来 表示。SwvwClient无连接服务器一般都是面向事务处理的, 一个请求、一个应答就完成了客户 程序与服务程序之间的相互作用。 若使用无连接的套接口编程,程序的流程可以 用图1.2表示。套接口工作过程如下:服务器首先启动,通过调用socket(建立一个套接口, 然后调用bind()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听的准备,并规定它的请求队列的长度,之后,调用accept(来接收连接。 客户在建立套接口后就可调用 connect()和服务器建立连

6、接。连接一旦建立,客户 机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数 据传送结束后,双方调用close()关闭套接口。在网络编程中,掌握端口的概念十分重要。端口:基于TCP/IP协议的网络中,计算机都分配有一个IP地址,用一个32位二进制数来表示,正式的称呼是 “Ipv4地址”。客户机需要通过TCP或UDP和服务器通信时,必须指定服务器 的IP地址和服务端口号。另外,服务器打算侦听接入客户机请求时,也必须指 定图1.2 一个IP地址和一个端口号。在选择端口时,应特别小心,因为有些可 用端口号是为“已知的”(即固定的)服务保留的,如文件传输协议和超文本传

7、输协议,即FTP (21号端口)和HTTP (般为8080端口)。“已知的协议”,即 固定协议,采用的端口由“互联网编号分配认证(IANA )”控制和分配,RFC1700 中说明的编号。从本质上说,端口号可分成3类:“已知”端口、已注册端口、动态和(或) 私用端口。“已知”端口 01023,由IANA控制,是在UNIX中为固定服务保留的。已注册的端口 102449151,由IANA列出来的,供普通用户的普通用户 进程或程序使用。 动态和(或)私用端口 4915265535普通用户应用应选择102449151 之间的已注册端口,从而避免端口号已被另一个应用或系统服务所用。此外,491526553

8、5间的端口可自由使用,因为 IANA这些端口上没有注册服务Client图1.2二、MFC对Socket编程的封装类简介 Microsoft Windows Class Library(MFC)中提供了较高级封装的类用来实现网络通信。图1.3 给出了 Csocket匸粘&虧$鲁衣时h|i IM 1 3:.呼讥类的继承关系。CAsyncSocket类圭寸装了 WindowsSockets API函数,提供了较低层的与 Win dows Sockets对话接口,一般适合于有相当水平的网络编程者使用,可方便 地进行底层的网络事件通知及信息回叫控制等操作。CSocket类派生于CAsyncSocket,

9、它继承了父类中一些常用易懂的 Windows Sockets API函数,并对CAsyncSocket中底层的较难控制的一些 API函数或成员 函数进行了处理,使得网络传输简捷易用,同时它支持模块化的后台信息处理, 解决了 CAsyncSocket中较难克服的多线程处理。下面介绍用 VisualC+在 Windows中实现Socket的CSocket类型成员函数(这些成员函数实际上是从CAsyncSocket类继承来的)。成员函数和参数说明:BOOL Create(UINT nSocketPort=O, int nSocketType =SOCK_STREAM , Io ng lEve nt=

10、FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD _CONECT|FD_CLOSE, LPCTSTR lpszSocketAddress=NULL)该函数用来建立Socket,如果函数成功,则返回非零值;否则返回值为0。 其中:nSocketPort为所选择的Socket端口,一般要大于1023,如果该参数为0, 则由系统选定一端口,默认值为 0。nSocketType: 为套接字类型 SOCK_STREAM 或 SOCK_DGRAM 。 SOCK_STREAM表示为流套接字(本实验使用基于TCP连接的流套接字编程), SOCK_DGRAM 表示为数据报套接字(将 在以

11、后实验中讲述), 默认值 为 SOCK_STREAM 。lEvent : 标 识 该 Socket 要 完 成 哪 种 工 作 , 默 认 值 为 FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE 。IpszSockAddress 个指向字符串的指针,该字符串包含了被连接套接口的 网络地址。一个带点的数字,如“ ”,默认值为 NULL。注意:CSocket中,Win sock API的初始化(socket)和绑定(bi nd)两部分工作都 完成了。 BOOL Liste n (int n Co nn ectio n

12、Backlog=5)该函数的作用是等待 Socket请求,如果调用成功,则返回非零值;否则返 回值为0。Listen仅对那些支持连接的套接字起作用,也就是SOCK_STREAM类型的套接字。 在进程应答连接并把它放到等待队列时, 套接字被置成被动模式 (passive mode。本函数一般由哪些一次可以有多个连接的服务器使用(或任何需要接收连接的应用) 。nConnectionBacklog:表示等待队列的长度,默认值为最大值5,有效值为15。 BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort) 该函数的作用是提出连接请求。其中:lpsz

13、HostAddress :对象连接的套接字的网络地址、 机器名,如 , 或以句点分隔的数字,如“ 00”。n HostPort :为接受请求进程的网络地址和 Socket端口号。注意: Connect 函数还有另一个版本: BOOL Connect(const SOCKADDR *lpSockAddr , intnSockAddrLen); 具体用 法可 以参阅 MSDN Library 中关于 CAn yscSocket 类的阐述。virtual void Close()该函数的作用是关闭该 Socket。三、利用CSocket进行传输的辅助类简介1.CSocketFi

14、le 类CSocketFile继承了 CFile类,见图1.4,它可以很自如地用来在基于 Windows Socket网络上传输数据。首先,将一个建立连接CSocket对象实例作为参数进行 初始化,然后,将已经初始化的 CSocketFile对象连接到CArchive对象上,接着 将数据串行化,以使用 MFC 系列来简化发送和接收数据,最终实现利用网络的 Socket传输和本机上的流传输一样简单。成 员 函 数 : CSocketFile 用 到 的 成 员 函 数 只 有 构 造 函 数 。CSocketFile:CSocketFile(CSocket*pSocket,BOOL bArchi

15、veCompatible=TRUE );其中: pSocket连接到CSocketFile对象的套接口。 bArchiveCompatible:指示该文件对象是否与一个 CArchive对象一起使用。 只有当希望在单机方式下来使用这个 CSocketFile对象时,才传递FALSE。因为仅有CSocketFile类实例本身并没有什么意义,所以通常将其置为TRUE。说明:此成员函数用来构造一个 CSocketFile对象。当此对象超出范围或被 删除时,它的析构函数将使它自己从插槽对象上分离。注意:一个CSocketFile对象也可以在没有CArchive对象的情况下作为一个 (受限制的)文件来使

16、用。缺省情况下,CSocketFile构造函数的bArchiveCompatible参数是TRUE,它表明此文件对象是与一个档案一起使用的。 要在没有档案的情况下使用该文件对象,则给bArchiveCompatible参数传递FALSE。在“档案兼容”模式下,一个 CSocketFile对象可以提供更好的表现, 并减少出现“死锁”的几率。CScrketFile图1.42. CArchive 类CArchive类没有基类。CArchive允许以一个永久二进制(通常为磁盘存储) 的形式保存一个对象的复杂网络,它可以从永久存储中装载对象,并在内存中重 新构造它们。使数据永久保留的过程就叫作“串行化”

17、。一般可以把一个CArchive 对象看作一个二进制流,可以将它和输入输出流iostream类的用法进行比较。CArchive对象一般和一个文件类关联(CFile类或CSocketFile类)。输入输出流 是加工处理ASCII字符,而CArchive类的用处是高效、无冗余地处理二进制数 据。在CArchive类中,重载了提取( )和插入( )运算符,它是方便的归 档编程接口,主要支持CObject派生类。四、MFCCSocket类的通信流程使用CSocket类进行网络二进制数据通信的连接流程,如下表所示/n server;枪电牛!o陥l炖9,2tR 10 匕耳A HI 1. If. tv.:t

18、 叩“中壮血北中。:(*址按ii Ir . j-riv 11 -Rkldr. -i :“):此吋飙取筲時麒务常箱血听4SrjckfLtl It* t-nx?;比糾阴耶.户肌雄播-购最新的和*机时歌用以播收 客户端的旌按3-.K-keiJ ii- 1 ilf lin枸施一文件时跟i卜 H卜 n 叩八A nil 沁CA nil3irji L llks IA 帆:】:A“屮irhi CA rth v-i.tid LA rthnvin Ml t - i A it tindttut ft file. C A 忧竹说二血ft*);RSir it kx*;用號9 fj料斜的榕含剛;im uikw;ir.u(

19、 -壮iLjf;C II C_m IKMn _m駅 Sirri?胸人龙送内沖的A;儿誑BC CGS IEMit十旳CMM谕人旌乌円雅洞工川碗ii lidjill MidCBuOkdiSt進拽超MKMFfif MrnnbrrK arMMfT iMAMMfew | &1际加 rwvrtF |L1*yMiI|ECJkCAua r-WufM* H OBMa MfMbHM|t细一 LleklE VmAMUpihtr h “也凤i;唁X | Cw:iR 18接着,再打开一个VC,建立客户机工程,工程名称为LX1 ,各个控件的ID 如下表,界面如图1.9所示。坯愛費型对阿界liLt的厂竹IH呻怕Ttt _t

20、i 卷iCS Irrupt:匚GN TIdk crlDC CON NEl 7ti _campf1;I H ifttwiit按拽锹ILIi -: 1II WldC UuttBiDC ai bcsrkuSt All熬11的的1底唯iuIH 1-11IH 1-11h CU世Sei4i43 g IwtKfMiOrfrtf .: Wlqn :iLrtl 岂于 oe.ar a controlitfi:迖个语句作用便发送按fH失效.以免还末连 接用门浹点缶发送.发生不酊预计的當课.为了在程序中!tfl由地处理CSocket得到的洎息. 0ittCSocket 的淞空类:任Lx2工程的I:作区类枕IU中(图L

21、I0)点占用hCSeiW 父类为 CSocket .IH 1-11Class对话鞭如IH 1.11忻示.Automvlioii h NuncL AninnitiilonIH 1-11A: 1x2DUiJi 浦 ton 头文t* inc lude Serverhpi ival 乞 Sit: CSt r. t i in serv t :( S ! i I x21)Iki:0nSend 0VpdateDataffRVE);V逍新数抑:.便m m ?J到F诉惟中文本in tvcv.Send in m c HI;m ctiLSetSelO. - 1);发送熬掘/全选发送恨文7m culRepheeSei

22、r TRUE);/ 将发送惬就空网样地.Lxl匚卅的【作中点击右躍浹加新类二Cclient它绅承门CSockeC. ?t CLxlD lu类电澹加private竇蟻.CC lient m client:女山对诂框圏像I的“连接”按钮海加代码= void C Lx 1D g:0nCoiuiectOI pdateDataffRVE);m_clientCreale(IOOl):便用 I001 右瑙 Iiftn c lien tConneeth ip, 10X)/11RII 杯地址.ioooiiAfiM essairBexTC lrntil按成功冷:in send.E nabtW in dm TRIE

23、):m connectE nableW index* G:A USE );连接成功.吋以发送网时荼止辻接按仇m clientC loseO;A fxU esSa煜Bo*连接 7m pM ai)W nd)-Show-A cceptO;II这里仅仅添加了这-句,因为CLi2Dlg类足发送接收消息的上谢口,II而且应用程序发送接收的消息也在CLx2D lg对彖实例中进行.H所以当CSender类的对彖收到客户机的Connect消息时,便可调用CLx2D k对彖中的ShowAcccptO换数处理.图 1.12该步完成以后,可以为CLx2D取类添加public成员函数Show A coop tO :vo

24、id CLx2l) lg:5howAcceplOm sender Accept reev):ACdl essageBoxfServer端连接成功);m send.Enable* bdowGRUE);连接成功,可以发送in listen.Enabled indow FALSE);同时禁止侦听按钮于是.当客户机调用n clientConnecth p, 1000);时,主机server端发现并调用Show Accept 函数来建工连接.执行完以后.Socket连接便被建工。接下來的工作便足添加发送聊只信息的函数了。注意到询血点击发送按侧的0nSendO函数已经泠加好了,在Lx2匸程中只翌添加Ser

25、ver 端的接收消息和显示消息功能就可以进行消息的传送。/: CSenrer类中像添加0nA cccptO 一样添加成员函数0nReceivoO :void CServer: nRecehrc(ht nE norCode)TODO : Add yourn)ecialMed code here and/6rcall the base chssC Socket:。n R cce he m pM ai)W nd)-Sh(MM sgO;建立连接后,一方一旦发送数据,另一方的CSocket派生类便训用该函数。其中代码町以参 考前而0nAcceptO进行理解。在CLx2Dk里添加成员函数ShowM sgO :voidCLx2Dlg:ShowM sgO接收消息到buF里面,长度255字节用AMI essagcBox两数显示接收到的字符串 这电注意CStrhg类的用法charbuft255:m txxv.R eceivoi)uG 255);CSti-i)gni s;msg.Fomi atf% s, but);AIxM essageBoxf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论