基于Java和UDP的多播通讯

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:lucien001
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:随着网络技术与计算机开发语言的发展,越来越多的程序员利用Java来编写网络程序。数据报通讯是一个高效的网络通讯方式。通过C/S模型的程序来说明Java中如何利用UDP进行多播通信,对于网络编程有一定的参考价值。
  关键词:Java;数据报;UDP;C/S;通讯
  中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)03-10669-01
  
  1 引言
  
  Java是一种可以编写跨平台应用软件的面向对象的程序设计语言。Java伴随着Internet的迅猛发展而发展,逐渐成为重要的网络编程语言。网络编程的目的就是指直接或间接地通过网络协议与其它计算机进行通讯,需要解决两个主要问题:一个是如何准确定位网络上的主机;另一个问题是找到主机后如何可靠有效地进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,而TCP层提供面向应用的可靠的或非可靠的数据传输机制。
  TCP/IP协议的名称中虽然只有TCP协议名,但是在TCP/IP的传输层同时存在TCP和UDP两个协议。这两个协议都可完成网络上从服务器到客户机的数据传输。
  
  2 Socket、TCP和UDP
  
  談及网络通讯,必定提到一个名词:Socket,中文是“套接字”。网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接,它是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。不管使用TCP还是UDP协议传输数据,都要用到Socket。
  TCP是传输控制协议,是Transfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个Socket之间必须建立连接,以便在TCP协议的基础上进行通信。
  UDP是用户数据报协议,是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址和目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
  TCP的传输是可靠的,而UDP的传输是不可靠的。为什么我们还要用UDP在网络上传输数据呢?因为保证数据的可靠传输是需要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,所以UDP的传输效率比TCP要高一些;而且许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,网络游戏,需要实时的交互,但并不要求音频视频的绝对正确。
  
  3 数据报多播通讯方式
  
  数据报(Datagram)就跟日常生活中的邮件系统一样,是不能保证每一封信都能可靠地寄到目的地。Java在java.net包是提供了三个类:DatagramSocket、DatagramPacket和MulticastSocket用来支持数据报多播通信。
  3.1 DatagramSocket
  DatagramSocket用于程序之间建立传送数据报的通信连接,是数据报通信中的Socket。在数据报实现C/S(Client/Server,客户机/服务器)通信程序时,无论在客户端还是服务器端,都要首先建立一个DatagramSocket对象,用来表示数据报通信的端点,应用程序通过Socket接收或发送数据报。
  DatagramSocket的构造方法如下:
  (1)DatagramSocket( ):与本机任何可用端口绑定
  (2)DatagramSocket(int port):与指定端口绑定
  (3)DatagramSocket(int port, InetAddress laddr):与指定本地地址的指定端口绑定
  其中,laddr指明一个可用的本地地址,可用IP地址;port指明Socket所使用的端口号。在选择端口时必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。0~1023的端口号为系统所保留,所以在选择端口号时,最好选择一个大于1023的数防止发生冲突。如果发生端口的冲突,会生成SocketException类异常。所以上述3个构造方法都声明抛出非运行时异常SocketException,程序中必须进行异常处理,或者捕获、或者声明抛出。
  3.2 DatagramPacket
  DatagramPacket用来表示一个数据报,它是传输数据的载体,封装了数据、数据长度、数据报地址等信息。DatagramPacket类的构造方法可以用来构造两种用途的数据报:接收外来数据的数据报和向外发送的数据报。构造方法如下:
  (1)DatagramPacket(byte buf[],int length);
  构造用来接收长度为length的数据报,字节数组buf存放数据报数据,length必须小于buf的长度。
  (2)DatagramPacket(byte buf[], int length, InetAddress addr, int port);
  构造用于发送指定长度的数据报,发送到指定主机的指定端口。
  (3)DatagramPacket(byte[]buf, int offset, int length);
  构造用来接收长度为length的数据报,并指定数据报在缓冲区buf中的偏移量offset。
  (4)DatagramPacket(byte[]buf, int offset, int length, InetAddress address, int port);
  构造用于发送指定长度的数据报,发送到指定主机的指定端口,并指定数据报的数据在缓冲区buf中的偏移量offset。
  3.3 MulticastSocket
  用于客户端接收服务器端发送的广播数据报。需要先创建多播数据报,并加入一个多播组。一个多播组由一个D类IP地址指定。D类IP地址的范围是:224.0.0.0~239.255.255.255,其中224.0.0.0是保留地址,不能使用。要加入到多播组,需要创建一个MulticastSocket并绑定到指定端口,然后调用该Socket的joinGroup(InetAddress groupAddr)方法。
  
  4 数据报多播通信实例
  
  采用数据报通信方式实现Client/Server的通信程序。程序由客户端和服务器端两部分组成。服务器端主机中有一个名为“bbb.txt”文件,文件中保存了一段英文。服务器端发送数据报的目的主机地址与端口固定为多播组地址。客户端从这个固定的主要地址和端口监听是否有数据报,如有则获取并显示数据。
  4.1 服务器端程序
  import java.io.*;
  import java.net.*;
  public class MultiUdpServer
  {DatagramSocket socket=null;
  BufferedReader in=null;
  boolean moreQuotes=true;
  public void serverWork() throws IOException
  {socket=new DatagramSocket(3335);//創建端口号为3335的数据报套接字
  in=new BufferedReader(new FileReader("bbb.txt"));
  while(moreQuotes)
  {byte buf[]=new byte[256]; //创建缓冲区
  DatagramPacket packet; //创建发送数据报对象
  String dString=null;//下面程序读取bbb.txt文件中一句英文并将它们存储在dString中
  if((dString=in.readLine())==null)
  {in.close();
  moreQuotes=false;
  dString="No more sentence. Bye!";}
  buf=dString.getBytes();
  InetAddress group=InetAddress.getByName("228.7.8.9");//多播组地址
  packet=new DatagramPacket(buf,buf.length,group,3336);
  // 构造要发送的数据报,并绑定主机地址和端口
  socket.send(packet);//发送数据报
  try{Thread.sleep(5000);}
  catch(InterruptedException e){} //间隔5秒广播}
  socket.close(); //关闭Socket}
  public static void main(String args[])
  {MultiUdpServer server=new MultiUdpServer();
  try
  {server.serverWork();}catch(IOException e){}}}
  4.2 客户器端程序
  import java.io.*;
  import java.net.*;
  public class MultiUdpClient
  {public static void main(String args[]) throws IOException
  {MulticastSocket socket=new MulticastSocket(3336);
  //创建多播组套接字,绑定端口
  InetAddress group=InetAddress.getByName("228.7.8.9"); // 绑定IP地址
  socket.joinGroup(group); // 加入多播组
  String bye="No more sentence.Bye!";
  DatagramPacket packet;//创建数据报对象
  for(int i=0;i<5; i++)
  {byte buf[]=new byte[256]; // 创建缓冲区
  packet=new DatagramPacket(buf,buf.length); //创建要接收的数据报对象
  socket.receive(packet);// 从服务器端获取数据报
  String received=new String(packet.getData());
  //将数据报中的数据转换为字串并输出
  System.out.println("The sentence send by the server:\n"+received);
  if(received.substring(0,23).equals(bye)) // 没有数据可接收,退出循环
  {break;}}
  socket.leaveGroup(group);//退出多播组
  socket.close(); //关闭套接字}}
  服务器端程序和客户端程序运行顺序可不定,但客户端程序运行时服务器程序必须还在向外发送数据报。客户端的MulticastSocket和服务器端的DatagramSocket必须绑定同一个端口,因为所有在多播组的客户端都要监听服务器端的数据报,不能使用非固定端口。
  当服务器端程序运行时,客户端程序可随时加入,所有多播组的客户端都可收到服务器发送的数据;但客户端根据加入的顺序和时间,所收到的数据报的个数是不同的,后加入的收到的数据报少一些。当服务器端数据发送完毕,多播组的所有客户接收到所需数据,Socket就关闭。
  
  5 结束语
  
  UDP是TCP协议的一种替代协议,为IP上快速传输数据而设计,但UDP是可靠性无法得到保障的协议。但对于质量要求不是很高的网络应用程序,UDP是一个很好的选择。在Java中,可以利用DatagramSocket、DatagramPacket和MulticastSocket三个类可以完成高质量的数据报多播通讯。
  参考文献:
  [1]张孝祥. Java就业培训教程[M]. 北京:清华大学出版社,2003.
  [2]刘正林. Java技术基础[M]. 武汉:华中科技大学出版社,2002.
  [3]朱喜福, 林建民, 唐永新. Java语言程序设计[M]. 北京:人民邮电出版社,2004.
  [4]印旻. Java与面向对象程序设计教程[M]. 北京:高等教育出版社,2002.
  [5]Jonathan Knudsen, Patrick Niemeyer. Learning Java, 3rd Edition [M]. O'Reilly, 2005.
  [6]Steven Haines, Steve Potts. Java? 2 Primer Plus. Sams Publishing, 2002.
  本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
其他文献
摘要:在介绍了XML的安全特性和其加密规范后,从Diffie-Hellman密钥协商的生成原理出发,运用XML加密规范所提供的对数据对象进行密钥协商的机制,并以经典的D-H密钥协商为例,依据规范所制定的原则,运用JCE所具有的安全特性为实现技术,就如何对密钥协商交换进行了探讨,从而为XML加密规范的实际应用探索了一种方式,并以此说明建立自主加密扩展的重要意义。  关键词:XML;数据加密;密钥协商
期刊
摘要:以Microsoft Visual FoxPro 6.0为关系数据库管理系统,以读者数据输入模块为例,详细分析与探讨了管理信息系统数据输入模块的设计思想与具体实现步骤及方法。  关键词:管理信息系统;数据输入模块;读者数据;VFP程序设计  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)03-10606-04    1 引言    数据输入模块是管理信息系统最关
期刊
摘要:《C语言程序设计》课程,是计算机科学与技术专业本科的一门必修课,也是一门实践性很强的课程,有较高的实验要求。旧有的教学模式很难将的知识传授给学生,传统的教学方法和手段已不能适应发展的需要,我们在C语言程序设计课程的教学中引入改革措施,首先编写教材,并在实验教学环节进行一系列的改革措施,得到了较好的效果。  关键词:《C语言程序设计》;教材建设;教学改革;教学模式  中图分类号:TP312文献
期刊
摘要:学生学籍信息是学校的一项重要数据资源,在教育改革和素质教育促使学校的招生规模不断扩大的背景下,学生的各种信息量成倍增长,传统的手工管理已无法满足学校管理者对学籍管理的需要。因此,本文利用PowerBuilder强大的数据库操作特性和其Window plug技术设计了一个基于web学生学籍管理信息系统,较好的满足了学校管理者对学籍管理的需求,提高了管理的效率。  关键词:Web;学籍;管理信息
期刊
摘要:隨着网络资源的日益丰富,从中发现潜在的、有价值的信息的商业需求一直推动着数据挖掘技术不断向前发展,由于Web数据本身具有半结构化、组织性差的特点,使得Web数据挖掘工作变得十分困难,而XML的出现为Web数据挖掘技术带来了新的契机和巨大的发展。本文介绍了XML技术以及Web数据挖掘,阐述了XML技术在Web数据挖掘中的应用。由于基于XML的Web数据挖掘是一门新兴的技术,如何进一步充分利用W
期刊
摘要:PowerPoint电子讲义(下简称PPT)是如今学校课堂教学中非常常用的媒体形式和教学资源整合工具,许多学科教师的教学从某种程度上已十分依赖这一软件工具,但其对教学内容以页面为单位的呈现方式,却容易使学生在听讲过程中出现“迷航”现象。本文结合自身的教学实践,对PPT制作和使用中的“迷航”问题提出了几种解决策略和实用的建议。  关键词:Power Point电子讲义;迷航;解决策略  中图分
期刊
摘要:基于日志分析的数据还原操作的设计增加了一种关于Oracle分布式数据库的同步方法,在不增加前台应用程序的前提下,通过对数据库进行日志分析,使分数据库与主节点数据库达到同步的效果。本文通过对LogMiner工具的详细介绍,并结合實际对Oracle数据库归档日志文件进行分析和还原DML语句的设计后,最终达到分布式数据库进行同步的效果。  关键词:Oracle;日志分析;LogMiner;数据还原
期刊
摘要:针对某些PACS系统中存在医学图像存储管理效率不高的问题,给出一种基于DICOM标准的医学图像存储管理设计方案。为了更好地实现用户与医学图像库之间的交互访问,采用层次细节的思想,对图像库划分层次,分别存储原始图像、调整比例后的小图标和利用JPEG2000实现保留感兴趣区域压缩其他区域生成的多分辨率图像。方案可以在一定程度上提高系统的存储、传输效率,满足不同要求下对图像的快速访问。  关键词:
期刊
摘要:本文介绍了软件复用的概念、级别和困难所在。针对软件复用的特性,阐述了如何进行基于组件的系统开发。  关键词:软件复用;基于组件的系统工程;基于组件的系统开发  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)03-10656-02    1 引言    随着人们对软件需求的不断增加,软件的功能、可操作性、智能化程度也迅速发展,从而使软件变得更加复杂、更加庞大在,开
期刊
摘要:由我国提交的第三代移动通信标准TD-SCDMA系统的关键技术之一就是智能天线技术,本文介绍了智能天线的提出及其分类,并且根据其优点深入分析了该技术在TD-SCDMA中的运用。  关键词:智能天线;第三代移动通信系统TD-SCDMA  中图分类号:V351文献标识码:A文章编号:1009-3044(2007)03-10654-02    1 引言    最近几年来随着全球移动通信业务的迅速发展
期刊