基于UDP协议的即时通讯程序客户端设计.docx
- 文档编号:10168812
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:19
- 大小:125.06KB
基于UDP协议的即时通讯程序客户端设计.docx
《基于UDP协议的即时通讯程序客户端设计.docx》由会员分享,可在线阅读,更多相关《基于UDP协议的即时通讯程序客户端设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于UDP协议的即时通讯程序客户端设计
基于UDP协议的即时通讯程序
——客户端的设计
学生姓名:
刘泽龙指导老师:
龙际珍
摘要本课程设计的目标是利用UDP协议编写相应的程序从而实现网络的即时通讯,其工作机制模仿即时通信软件的基本功能。
采用UDP协议原理,分别为客户端和服务器端完成基本数据配置,实现网络的即时通讯功能。
在本课程设计中,主要负责通讯程序客户端的设计,系统的开发平台为Windowsxp,程序设计语言采用Java,程序的运行平台eclipse。
程序通过调试、运行,初步实现了设计的目标,并且经过适当的完善后,可以应用于网络即时聊天。
关键字Java语言;即时通讯;UDP协议;套接字
1引言
自进入信息化社会以来,人们的生活发生了翻天覆地的变化,所有这一切的实现都要归功于计算机网络。
自从计算机网络出现以来,网络发展越来越迅速,其重要性更是不可估量。
现在,网络已经进入到我们生活的各个角落,大到网上理财、网上会议、网上战争,小到上网购物、查找资料,网上聊天等,可以说网络把我们的世界变“小”了,即使在天涯海角,我们也可以随时联系。
一个最简单且应用最广泛的例子——网上聊天,就是最好的证明。
本课程设计将基于UDP协议[1]和局域网环境,使用Java语言实现一个即时网络通讯程序。
1.1背景介绍
随着计算机网络信息技术的日益发展和成熟,人们的生活因为网络而变得更多姿多彩,基于网络的通讯技术也如同雨后春笋般涌现到网络世界中。
TCP协议和UDP协议是网络通讯的基本协议。
而对于普通的信息交流,UDP协议则因为更方便简单,所以常常采用UDP协议开发这类即时通讯程序。
在国内占据网络通讯霸主地位则是腾讯公司的QQ原型,就是采用UDP协议开发而成的。
1.2课程设计的目的
(1)通过本课程设计,熟练掌握Java语言的编程技术、步骤和程序的编写与调试过程。
(2)理解UDP协议的基本功能和工作原理。
(3)培养运用理论知识解决实际问题的能力。
(4)理解UDP协议在Java编程语言中的具体体现。
(5)运用所学的知识,学会分析程序,并从实际上实现即时通讯的要求。
1.3课程设计的基本任务
本次课程设计是基于UDP协议的通讯程序,所以其基本任务就是要实现的是服务器和客户端的通讯,即服务器对端口进行监听,客户端发送数据给服务器,服务器接收。
实现了这个过程,就达到了本次课程设计的目的。
2开发环境介绍
2.1Java简介
Java[2]是一种简单易用、完全面向对象、具有平台无关性且安全可靠的主要面向Internet的开发工具。
Java是由美国Sun公司于1995年5月推出的Java程序设计语言和Java平台的总称。
Java语言是一个支持网络计算的面向对象程序设计语言。
Java语言吸收了Smalltalk语言和C++语言的优点,并增加了其它特性,如支持并发程序设计、网络通信、和多媒体数据控制等。
Java编程语言的风格十分接近C++语言。
继承了C++语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operatoroverloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间。
Java平台是基于Java语言的平台。
这样的平台目前非常流行,因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言。
Java平台由Java虚拟机(JavaVirtualMachine)和Java应用编程接口(ApplicationProgrammingInterface、简称API)构成。
目前常用的Java平台基于Java1.4,最近版本为Java1.7。
Java分为三个体系J2SE,J2EE,J2ME。
2.2Java的特点
Java语言是一个支持网络计算的面向对象程序设计语言。
Java语言吸收了Smalltalk语言和C++语言的优点,并增加了其它特性,如支持并发程序设计、网络通信、和多媒体数据控制等。
其主要特性如下:
(1)Java语言是简单的。
(2)Java语言是面向对象的。
(3)Java语言是分布式的。
(4)Java语言是健壮的。
(5)Java语言是安全的。
(6)Java语言是体系结构中立的。
(7)Java语言是可移植的。
(8)Java语言是解释型的。
(9)Java语言是高性能的。
(10)Java语言是多线程的。
(11)Java语言是动态的。
3UDP协议及套接字
3.1UDP协议简介
UDP协议和TCP协议是Internet的传输层上的两个主要的协议,其中前者是无连接的协议,后者是面向连接的协议。
UDP是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。
UDP用户数据报协议,是一个简单的面向数据报传输层的协议。
UDP提供不可靠的连接,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。
由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
UDP协议的主要作用是将网络数据流量压缩成数据报的形式。
一个典型的数据报就是一个二进制数据的传输单位。
每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
UDP协议使用端口号为不同的应用保留其各自的数据传输通道。
UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。
数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。
有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。
因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。
一般来说,大于49151的端口号都代表动态端口。
数据报的长度是指包括报头和数据部分在内的总的字节数。
因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。
数据报的最大长度根据操作环境的不同而各异。
从理论上说,包含报头在内的数据报的最大长度为65535字节。
不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。
UDP协议使用报头中的校验值来保证数据的安全。
校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。
如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。
其实在UDP协议中校验功能是可选的,如果将其关闭可以使系统的性能有所提升。
这与TCP协议是不同的,后者要求必须具有校验值。
3.2UDP协议结构与特点
数据报由报头和传输的数据组成。
UDP报头由4个域组成,其中每个域各占用2个字节,具体包括:
源端口号、目标端口号、数据报长度、校验值。
源端口—16位。
源端口是可选字段。
当使用时,它表示发送程序的端口,同时它还被认为是没有其它信息的情况下需要被寻址的答复端口。
如果不使用,设置值为0。
目标端口—16位。
目标端口在特殊因特网目标地址的情况下具有意义。
数据报长度—16位。
该用户数据报的八位长度,包括协议头和数据。
长度最小值为8。
校验和—16位。
IP协议头、UDP协议头和数据位,最后用0填补的信息假协议头总和。
如果必要的话,可以由两个八位复合而成。
数据域—包含数据信息。
UDP协议得到了广泛的应用。
其特点如下:
1、UDP传送数据前并不与对方建立连接,即UDP是无连接的,在传输数据前,发送方和接收方相互交换信息使双方同步。
2、UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息(如TCP所采用的序号),而且报文不一定按顺序到达的,所以接收端无从排起。
3、UDP对接收到的数据报不发送确认信号,发送端不知道数据是否被正确接收,也不会重发数据。
4、UDP传送数据较TCP快速,系统开销也少。
5、由于缺乏拥塞控制(congestioncontrol),需要基于网络的机制来减小因失控和高速UDP流量负荷而导致的拥塞崩溃效应。
换句话说,因为UDP发送者不能够检测拥塞,所以像使用包队列和丢弃技术的路由器这样的网络基本设备往往就成为降低UDP过大通信量的有效工具。
数据报拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速率UDP流中增加主机拥塞控制来减小这个潜在的问题。
从以上特点可知,UDP提供的是无连接的、不可靠的数据传送方式,是一种尽力而为的数据交付服务。
3.3UDP建立
UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。
TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其他信息,否则将一直等待直到收到确认信息为止。
与TCP不同,UDP协议并不提供数据传送的保证机制。
如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示,因此,通常人们把UDP协议称为不可靠的传输协议。
相对于TCP协议,UDP协议的另外一个不同之处在于如何接收突发性的多个数据报。
不同于TCP,UDP并不能确保数据的发送和接收顺序。
当客户端需要用到一个使用UDP协议的远程主机上的应用程序时,它需要知道两方面的信息:
应用程序所在主机的IP地址和应用程序目的端的UDP端口号[3]。
现在,假设一台主机知道应用程序在另一台IP地址为128.1.123.1的主机上。
在获得了IP地址后,它需要知道应用程序的目的端口号是多少。
所有的UDP端口号和TCP端口号都存放在一种称为服务文件(ServiceFile)的文件中。
在UNIX系统中,服务文件通常位于/etc/services下。
在Windowsxp主机中,可以在c:
\windows\system32\drivers\etc下找到服务文件。
服务文件包括了应用程序到TCP端口号和到UDP端口号的所有映射。
当一个主机需要知道应用程序的目的UDP端口号和目的TCP端口号时,它会搜索服务文件来找出正确的端口号。
通常应用程序将它们各自的UDP端口号或TCP端口号安装在这个服务文件中。
由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。
这是通过使用UDP的“端口号”完成的。
例如,如果一个客户希望在服务器128.1.123.1上使用域名服务系统,它就会给数据包一个目的地址128.1.123.1,并在UDP头插入目标端口号53。
源端口号标识了请求域名服务的本地机的应用程序,同时需要将所有由目的站生成的响应包都指定到源主机的这个端口上。
3.4客户机/服务器模式
传输层的通信有时也称为客户端/服务器端[4]通信。
典型情况是一个主机(客户端)需要使用另一个主机(服务器)上的应用程序。
当客户端需要用到一个使用UDP协议的远程主机上的应用程序时,它需要知道两方面的信息:
应用程序所在主机的IP地址和应用程序目的端的UDP端口号。
其工作过程描述如下:
服务器端描述:
S端启动服务进程,并监听相应端口。
然后,若收到C端发出的有关请求,按如下情况给出相应的反映:
将收到的包进行检测,若收到的包有错则抛弃(discard),并发给C端一个negtiveACK。
若收到的包正常,则将此包进行解包,将内容输出至一临时文件;并发给C端一个positiveACK。
依次收到来自C端的包,直到收到end为止,并关闭此进程,转回监听状态。
客户端描述为:
若收到的为PositiveACK,则继续发包;若收到的为NegtiveACK,则将应发的包重发。
直到C端将所有要发的包都发完,并都已经收到S端的回应,最后发一个End包,直接关闭此进程。
综上所述,应用中的服务器程序必须先于客户机进程启动,直到对客户机的响应结束或强迫终止。
3.5套接字编程原理
socket/套接字
socket[5]提供了在主机之间传递原始字节流的功能,以比较底层的方式访问UDP协议层.可以类似访问文件I/0的方式实现这一功能。
UDP协议规定,每台主机都有一个名称,然而,同一台主机上有可能同时运行很多UDP程序.每个socket被指派了一个叫做端口的数字以加以区分不同的应用或者连接.http应用服务器的端口一般被指定为80,DbAnywhere通常指定为8889.我们通过这种方式区分你向远程或者本地主机请求连接的服务.一个socket被定义为地址:
端口,例如:
8889
1、创建套接字——socket()
功能:
使用前创建一个新的套接字
格式:
SOCKETPASCALFARsocket(intaf,inttype,intprocotol);
参数:
af:
通信发生的区域
type:
要建立的套接字类型
procotol:
使用的特定协议
2、建立套接字连接——connect()和accept()
功能:
共同完成连接工作
格式:
intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);
SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*name,intFAR*addrlen);
3、监听连接——listen()
功能:
用于面向连接服务器,表明它愿意接收连接。
格式:
intPASCALFARlisten(SOCKETs,intbacklog);
4、数据传输——send()与recv()
功能:
数据的发送与接收
格式:
intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);
intPASCALFARrecv(SOCKETs,constcharFAR*buf,intlen,intflags);
参数:
buf:
指向存有传输数据的缓冲区的指针。
4设计过程
此次设计是编写一个基于UDP的即时通讯程序,要求双方能够进行即时通讯,实现聊天。
本课程设计主要负责的是通讯程序客户端的设计。
其具体设计如下。
4.1总体设计流程图
即时通讯程序客户端/服务器端总体设计流程图如图(1-1)。
图(1-1)总体设计流程图
4.2详细设计
根据UDP协议的基本特性以及Java语言编程特点,然后对比设计流程图,在Eclipse编程环境下编写出实现该即时聊天系统的程序,具体步骤如下:
1.打开Eclise创建一个Java工程,命名为UDPChat。
2.在Java工程目录下创建一个package,命名为UDPChat。
3.在此package目录下创建一个类,类名为Client,创建完之后弹出一个编辑窗口,在此编辑环境下编写客户端程序,其客户端核心程序如下:
publicstaticvoidmain(String[]args){
newUDPClient().start();//调用UDPClient()函数,启动客户端
}
}
classUDPClientextendsThread{
publicUDPClient(){}
publicvoidrun(){
//和服务器之间进行连接
System.out.print("请输入所要通讯的服务器的地址:
");
Stringserverip=null;//定义一个数组,用来保存服务器地址,初始化为NULL.
//进行异常处理
try{
serverip=newBufferedReader(newInputStreamReader(System.in)).readLine();//取得输入的服务器地址
}catch(IOExceptione1){
//错误处理
e1.printStackTrace();
}finally{
try{
DatagramSocketsocket=newDatagramSocket();//建立Socket连接
//实现服务器和客户端程序间的不间断通讯
while(true){
//发送消息
System.out.print("客户端发送的消息为:
");//打印消息
Stringsend=newBufferedReader(new
InputStreamReader(System.in)).readLine();//读入客户机输入的消息
byte[]outstr=newbyte[send.length()];//定义一个字节数组,长度为客户端所发送的消息长度
outstr=send.getBytes();//将得到的客户端消息保存数组中
InetAddressaddress=InetAddress.getByName(serverip);
DatagramPacketpacket=newDatagramPacket(outstr,outstr.length,address,80);//向服务器发送数据报
socket.send(packet);//发送数据报
//接收
byte[]instr=newbyte[200];//定义数组,用来保存接受的数据报
packet=newDatagramPacket(instr,instr.length);//接收数据报
socket.receive(packet);//接收数据
Stringout=newString(packet.getData(),0,packet.getLength());//取出信息
System.out.println("接受到的服务器消息:
"+out);//打印服务器发过来的信息
}
}catch(Exceptione){
//错误处理
e.printStackTrace();
}
}
}
}
4.3运行程序。
运行程序,要结合周泽斌编写的服务器端程序(程序见附录二),运行服务器端程序(程序见附录一),结果如图(1-2)。
图(1-2)服务器程序运行结果
运行客户端程序,得出客户端如图(1-3)。
图(1-3)客户端程序运行结果
客户端对话框输入所要连接的服务器的IP地址,进行客户端和服务器端的连接,连接后,出现如图(1-4)结果。
图(1-4)服务器和客户端连接
接下来,客户端和服务器端进行连接后,可以进行正常的聊天了。
其程序执行结果如图(1-5)所示。
图(1-5)服务器和客户端之间的通讯
4.4结果分析
根据以上程序的执行情况可知,服务器端和客户端实现成功的连接。
根据客户端和服务器端的通许状况可知,所设计的即时通讯程序符合要求,达到了预期的目标。
5结束语
一学期的计算机网络课程的学习,总觉得就是学习,没什么用途。
自从做了此次课程设计,我才后悔当初自己学习不是很认真。
本次课程设计是利用java语言编写的,虽说自己以前并没有接触过这种语言,但是经过这两周的学习,我受益匪浅。
首先,我弄懂了JAVA语言的编程方法和原则,并学会了编写java程序。
其次,使我更深层次的理解到JAVA语言是一种面向对象的语言,具有可视化编程的特点且代码具有可移植等特点。
本次课程设计是实现一个UDP即时通讯程序。
经过编写程序和运行,调试程序,我对java语言有了更深的了解。
另外,使我对UDP协议的特点和工作过程有了更深的了解。
UDP协议提供无连接的、不可靠的服务。
它工作于传输层[6],是传输层的重要协议之一。
最后,UDP协议是利用客户端和服务器端模型来实现传输的。
本次课程设计使我明白了知识的重要性,同时也更加懂得实践更不可少。
我们要经常把所学的知识运用到实践,这样,才能充分的融会贯通。
同时,也使我认识到自己动手能力太差,为我以后的学习和发展提供了一个警钟!
本次课程设计的过程中,虽然遇到了不少问题,但最后还是成功的完成了,这得益于老师的指导和同学们的配合,使我充分体验到了团结的重要性。
最后,在这里,我要感谢学校为我们提供了这次锻炼自己的机会,同时也感谢各位老师对我的指导和同学们帮助,希望这样的锻炼的机会会有下次。
参考文献
[1]AndrewS.Tanenbaum.潘爱民.计算机网络(第四版).清华大学出版社,2004
[2]孙卫琴.JAVA面向对象编程.电子工业出版社,2006
[3]张立等.基于Client/Server模式的数据库应用软件的设计与实现.计算机应用研究[J],1999
[4]俞俊/李功/汪晓平.Java网络编程.清华大学出版社,2005
[5]谢希仁.计算机网络(第四版)[M].电子工业出版社,2003
附录1:
客户端程序设计清单
//程序名称:
Client.java
//程序功能:
实现UDP即时通讯客户端的功能
//程序作者:
刘泽龙
//最后修改日期:
2009-7-4
packagecom.briup.gui;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
import.DatagramPacket;
import.DatagramSocket;
import.InetAddress;
publicclassClient{
publicstaticvoidmain(String[]args){
newUDPClient().start();//调用UDPClient()函数,启动客户端
}}
classUDPClientextendsThread{
publicUDPClient(){}
publicvoidrun(){
//和服务器之间进行连接
System.out.print("请输入所要通讯的服务器的地址:
");
Stringserverip=null;//定义一个数组,用来保存服务器地址,初始化为NULL.
//进行异常处理
try{
serverip=newBufferedReader(newInputStreamReader(System.in)).readLine();//取得输入的服务器地址
}catch(IOExceptione1){
//错误处理
e1.printStackTrace();
}finally{
try{
DatagramSocketsocket=newDatagramSocket();//建立Socket连接
//实现服务器和客户端程序间的不间断通讯
while(true){
//发送
System.out.print("客户端发送的消息为:
");//打印消息
Stringse
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 UDP 协议 即时通讯 程序 客户端 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)