网络编程论文文档格式.docx
- 文档编号:17458102
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:13
- 大小:150.33KB
网络编程论文文档格式.docx
《网络编程论文文档格式.docx》由会员分享,可在线阅读,更多相关《网络编程论文文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
2.1socket开发Internet应用程序的一般模型…………………………
2.2网络聊天系统工作流程…………………………………………………
三详细设计与实现………………………………………………………………
3.1客户端模块设计…………………………………………………………
3.2连接用户模块设计………………………………………………………
四运行与调试…………………………………………………………………
4.1运行结果………………………………………………………………
4.2出现问题及解决办法…………………………………………………
五总结…………………………………………………………………………
参考文献…………………………………………………………………………
1.1网络聊天系统相关背景
目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC、网易泡泡等,国外有著名的MSN(新版改名为LiveMessenger)以及跨平台Gaim等。
本人取最具代表性的QQ和MSN进行了一些研究,作为开发聊天系统的准备。
腾讯无疑是国内即时通讯市场的霸主,自从99年进入即时通讯领域并迅速占市场之后,其在国内用户数量始终高居榜首,即使近几年面对微软MSN的强大攻势,腾讯QQ的时常占有率依然稳步增长。
腾讯的成功与其对QQ的不断创新和完善是分不开的。
参考了许多网络上的资料,以及自己通过观察腾讯QQ运行时的各种细节。
可以确定腾讯QQ是以多服务器提供服务、服务器总控客户端、客户端之间UDP直连通信的。
并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信。
图1腾讯QQ服务器-客户端模型
与腾讯QQ不同,微软的MSNMessenger只使用了TCP作为传输层通信协议,所有客户端与服务器进行连接,然后通过与服务器的TCP连接进行中转通信。
图2MSN服务器-客户端模型
腾讯使用的模型中,服务器主要处理客户端各种状态的控制,可以极大减轻服务器的处理压力,但其内部协议和实现复杂度都较高。
而MSNMessenger所有数据都要经过服务器,服务器压力可想而知(难怪平时很少见到使用MSN进行语音视频聊天的)。
上述软件都实现了广域网上的即时通信,在使用方面各有特色,在实现方面也各有所长。
但是随着企业规模的扩大,业务量的增加,企业内部的信息越来越私密,企业只希望员工通过内部局域网进行沟通与交流,避免企业内部机密通过Internet泄露到外部,所以局域网的聊天工具也占了很大的市场[4]。
1.2VC6.0及socket简介
VC6.0简介
VC6.0是微软推出的一款可视化编程工具,适用面非常广泛。
VC6.0包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。
使用VC6.0,可以完成创建、调试、修改应用程序等的各种操作。
VC6.0采用标准的多窗口Windows用户界面,并增加了一些新特性,使得开发环境更易于使用,用户很容易学会它的使用方法。
由于VC6.0是一个可视化的开发工具,在介绍VC6.0的各个组成部分之前,首先了解一下可视化编程的概念。
可视化技术是当前发展迅速并引人注目的技术之一,它的特点是把原来抽象的数字、表格、功能逻辑等用直观的图形、图象的形式表现出来。
可视化编程是它的重要应用之一。
所谓可视化编程,就是指:
在软件开发过程中,用直观的具有一定含义的图标按钮、图形化的对象取代原来手工的抽象的编辑、运行、浏览操作,软件开发过程表现为鼠标点击按钮和拖放图形化的对象以及指定对象的属性、行为的过程。
这种可视化的编程方法易学易用,而且大大提高了工作效率。
什么是socket
所谓socket通常也称作"
套接字"
,应用程序通常通过"
向网络发出请求或者应答网络请求。
以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。
ServerSocket用于服务器端,Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
1.3网络聊天程序设计意义
近年来,随着全球信息化的不断发展,网络也在飞速发展。
出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。
在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。
然而,随着企业规模的扩大,业务量的增加,企业内部的信息越来越私密,企业只希望员工通过内部局域网进行沟通与交流,避免企业内部机密通过Internet泄露到外部。
为了解决上述矛盾,人们提出了开发局域网聊天软件的构想,通过局域网聊天软件,企业员工可以随时的进行即时消息传递,召开网络会议等,有利于提高工作效率,同时又保护了企业内部信息的安全。
随着用户对软件功能的需求不断提高,即时通讯的产品也不断地更新换代。
即时通讯的发展不论是在基础应用方面还是在扩展应用方面都有着飞跃。
为了满足用户的需求,包括腾讯公司的聊天软件QQ在内,许多即时性聊天工具都推出了语音聊天、视频聊天功能模块。
本课题研究的是基于局域网的聊天室,用VC++编写的程序,程序实现一般的文字聊天功能,可作为某局域网的交流工具。
本系统采用基于Socket的方法实现局域网通信,基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。
它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。
基于Socket的局域网聊天工具很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。
它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点[3]。
基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。
如今基于局域网的即时通信工具一般采用UDP或者TCP协议体系来实现,开发技术已经比较成熟。
UDP的实时性比较好,但是不一定提供可靠的数据传输,TCP可以提供可靠的数据传输,本课题采用TCP完成局域网聊天室的设计。
2.1socket开发Internet应用程序的一般模型
Socket原来是UNIX的BerkeleySoftwareDistributiion版本中的一个程序接口,属于系统调用。
在Windows操作系统下,WinSock是定义于视窗应用程序与网络之间的标准界面。
程序设计者利用WinSock的标准规格,完全不考虑所使用的网卡硬件部分,WinSock所提供的动态连接程序库(WS2_32.DLL)完成与网络底层驱动程序协同的工作,WinSock采用套接字(端口号+IP地址)方式建立与网络上其他计算机的连接。
利用socket开发Internet应用程序的一般模型为:
图3Client/Server连接的基本结构
2.2网络聊天系统工作流程
图4系统总工作流程图
首先启动聊天室的服务端,设置端口,打开监听。
然后启动客户端(可启动多个),设置用户昵称和连接端口等信息,连接服务器。
进入聊天室后用户之间可以进行简单的文字聊天。
当用户发送信息后,服务器会收到用户发送的信息,然后服务器把收到的信息发送给所有在线用户。
这样登入服务器的用户们之间就可以进行简单的文字聊天了。
当用户进入聊天室后,服务器会发送相应的消息通知该用户进入了聊天室。
当用户断开连接后,服务器也会通知该用户下线。
整个聊天室基于CSocket的流式连接放大。
基于TCP传送控制协议。
该协议所要求用户必须先确定连接成功后才能发送消息,如果是UDP协议那可以不进行连接过程,这样实时性比较好。
三网络聊天程序详细设计
3.1客户端模块设计
连接模块设计:
客户端计算机获取本机开放的socket端口23,再发送目标主机的IP,通过connection()函数与服务端建立连接,如果connection()作用结果出现错误的socket,则连接失败,否则通过recv()函数接收服务器发送的字符串,即为服务器发送的欢迎信息。
模块程序如下:
……
intconnection()
{
WSAreturn=WSAStartup(0x101,&
WSAData);
//始化一个WSADATA结构
if(WSAreturn)
printf("
发生一个未知错误!
\n"
);
return0;
}
//创建一个套接口。
//第一个参数:
一个地址描述。
目前仅支持AF_INET格式,也就是说ARPAInternet地址格式。
//第二个参数:
新套接口的类型描述。
(SOCK_STREAM可用send()和recv()传送数据)
//第3个参数:
套接口所用的协议。
如调用者不想指定,可用0
client=socket(AF_INET,SOCK_STREAM,0);
to.sin_family=AF_INET;
//sin_port存储端口号(使用网络字节顺序)
to.sin_port=htons(23);
while(TRUE)
请输入要登陆的IP:
"
scanf("
%s"
&
servername);
//sin_addr存储IP地址,使用in_addr这个数据结构
to.sin_addr.s_addr=inet_addr(servername);
正在连接...\n"
result=connect(client,(structsockaddr*)&
to,sizeof(to));
if(SOCKET_ERROR==result)
//连接失败
对不起,无法连接到目标主机!
WSACleanup();
else
cansend=FALSE;
recv(client,receive,sizeof(receive),0);
*******欢迎消息消息*******\n"
%s\n"
receive);
***********结束*********\n"
信息发送与接收模块设计:
分别利用send()函数和recv()函数发送和接收信息。
%s\0"
chatto);
send(client,chatto,strlen(chatto),0);
recv(client,chatfrom,sizeof(chatfrom),0);
chatfrom);
3.2连接用户模块设计
连接用户模块设计:
通过GetIp()函数获得客户端IP,然后开放一个端口,绑定并监听端口。
接受来自客户端的连接,并向客户端发送欢迎信息。
与客户端建立连接。
intGetIp()
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)23);
server=socket(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET)
无法创建套接字!
if(bind(server,(structsockaddr*)&
local,sizeof(local))!
=0)
无法绑定套接字!
if(listen(server,5)!
无法监听端口!
正在等待用户连接...\n"
client=accept(server,(structsockaddr*)&
from,&
fromlen);
strcpy(information,inet_ntoa(from.sin_addr));
strcat(welcome,information);
printf("
接受来自%s的连接...\n"
inet_ntoa(from.sin_addr));
正在发送欢迎消息...\n"
send(client,welcome,strlen(welcome),0);
//send(client,ip,strlen(ip),0);
//send(client,information,strlen(information),0);
欢迎消息信息已经成功发送至客户端!
chat);
send(client,chat,strlen(chat),0);
四运行与调试
4.1运行结果
在局域网内的一台PC机的VC++6.0平台上运行服务端程序,并与客户端PC机之间通信。
程序运行窗口如下图所示:
图5服务端程序运行后的聊天窗口
在同一局域网内的另一台PC机的VC++6.0平台上运行服务端程序,并与客户端PC机之间进行通信。
图6客户端程序运行后的聊天窗口
4.2出现问题及解决办法
在编写服务端和客户端程序时,始终出现链接错误。
错误提示如:
errorLNK2001:
unresolvedexternalsymbol__imp__closesocket@4。
…
Debug/00.exe:
fatalerrorLNK1120:
9unresolvedexternals
Errorexecutinglink.exe.
其问题在于缺少一句连接到库的语句。
因此,其解决办法是在程序开头添加一条连接到库的语句即可。
五总结
聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。
因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:
在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。
因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。
为了利用重载套接字的消息相应函数,必须从CAsyncSocket派生出自己的套接字类,有时为了分开监听套接字和客户端套接字,还应该分别派生监听套接字类和客户端套接字类。
利用这两类函数就可以开始写网络通信程序。
线程函数可声明为全局函数或者是类的静态函数,为了维护代码的封装性,开发中选择了后者。
对于线程函数中收到的消息怎么传回给对话框呢?
最初试图通过定义一个全局变量,再用API函数SetDlgItem()处理,但是编译出现了问题,指出申明的全局变量没有定义。
线程函数定义为全局函数(也可以使某个类的静态函数),为什么线程里的数据不能直接传送呢?
最后只得采用PostMessage()的方法将消息回传,这次成功的完成了消息传递。
接着问题又出现了,虽然成功的接受和发送了消息,但是消息最后会出现乱码。
对于出现乱码的问题一般是数组越界访问才会发生,在设计的过程中最好是对数组进行安全性检测。
可是这次的乱码出现不同寻常,最后也没一个很好的解释,只有另寻他径,完成设计。
需要指出的一点,不提倡使用全局函数和变量是有原因的。
全局函数和变量虽然对很多棘手的问题都能方便实现,但是对程序的封装性和可移植性是个很大的挑战。
C++的优点便在于多态的实现和程序的封装,程序员会尽量去提高整个程序的低耦合度,让开发的程序便于移植。
在多文件程序中,全局变量可能在多个地方被修改,所以维护起来麻烦,在查错时也不好发现。
而且全局变量可能会出现重复定义问题,使编译出现错误。
参考文献
[1]李凌.WinSock2网络编程实用教程[M].北京:
清华大学出版社,2005.
[2]孙鑫,余安萍.VC++深入详解[M].北京:
电子工业出版社,2006.
[3]JacksonMA.PrinciplesofProgramDesign[M].Houston:
AcademicPress,2000.
[4]候俊杰.深入浅出MFC[M].武汉:
华中科技大学出版社,2001.
[5]冯宏华,徐莹.C++应用程序性能优化[M].北京:
电子工业出版社,2007.
[6]张虹.软件工程与软件开发工具[M].北京:
清华大学出版社,2009.
[7]罗军舟.TCP/IP协议及网络编程技术[M].北京:
清华大学出版社,2008.
[8]张越.VisualC++网络程序设计实例详解[M].北京:
人民邮电出版社,2006.
[9]BruceEckel.ThinkinginC++[M].北京:
机械工业出版社,2009.
[10]张正秋.WINDOWS程序捆绑核心编程[M].北京:
清华大学出版社,2007.
[11]钱乐秋.软件工程[M].北京:
[12]郑人杰.实用软件工程[M].北京:
清华大学出版社,2002.
[13]陈世鸿,彭蓉.面向对象软件工程[M].北京:
电子工业出版社,1999.
[14]AnthonyJones.NetworkProgrammingforMicrosoftWindows[M].Microsoftpress,2002.
[15]史济民.软件工程原理与应用[M].北京:
高等教育出版社,2002.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)