Java数据报编程之概说

编程|数据

 
一般说明

在TCP/IP协议族中,UDP和TCP同样位于传输层,用户数据报是UDP协议中的概念.

UDP协议提供面向事务的简单不可靠信息传送服务,它不提供对 IP 协议的可靠机制、流控制以及错误恢复功能.

UDP 协议基本上是IP 协议与上层协议的接口,从整个用户数据在各层的包装看,UDP报文格式相当简单:

1632bitSource port源端口Destination port目标端口Length 报文长度(单位是字节,包括首部和用户数据区)Checksum(校验和)Data

由于校验和的原因,UDP还引入了伪首部,这导致了UDP和IP层的关系过于密切,破坏了分层原则.

Java数据报支持

包java.net中提供了两个类DatagramSocket和DatagramPacket用来支持数据报通信,DatagramSocket用于在程序之间建立传送数据报的通信连接, DatagramPacket则用来表示一个数据报。

DatagramSocket代表发送和接收数据报的套接字,一个数据报套接字是为包递送服务的发送和接收点,在一个数据报套接字上,每个被发送和接收的包都被独立的寻址和路由,从一台机器到另一台机器上发送的多个包有不同的路由,任意的抵达顺序.

对于DatagramSocket,UDP广播发送总是使能的(那是缺省设置).为了接收广播包这个类实例应该绑定到通用地址(wildcard address).在某些实现中,当被绑定到更多特定地址上的时候广播包也可以接收.

例如:

DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));
这等同于:
DatagramSocket s = new DatagramSocket(8888); 
两种情况都会创建一个能在端口8888上接收广播的DatagramSocket实例.

Constructor Summary DatagramSocket()
          Constructs a datagram socket and binds it to any available port on the local host machine.protected DatagramSocket(DatagramSocketImpl impl)
          Creates an unbound datagram socket with the specified DatagramSocketImpl. DatagramSocket(int port)
          Constructs a datagram socket and binds it to the specified port on the local host machine. DatagramSocket(int port, InetAddress laddr)
          Creates a datagram socket, bound to the specified local address. DatagramSocket(SocketAddress bindaddr)
          Creates a datagram socket, bound to the specified local socket address. 

其中,port指明socket所使用的端口号,如果未指明端口号,则把socket连接到本地主机上一个可用的端口。laddr指明一个可用的本地地址。给出端口号时要保证不发生端口冲突,否则会生成SocketException类例外。

用数据报方式编写通信程序时,通信双方,首先都要建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体。下面看一下DatagramPacket的构造方法 :

Constructor SummaryDatagramPacket(byte[] buf, int length)
          Constructs a DatagramPacket for receiving packets of length length.DatagramPacket(byte[] buf, int length, InetAddress address, int port)
          Constructs a datagram packet for sending packets of length length to the specified port number on the specified host.DatagramPacket(byte[] buf, int offset, int length)
          Constructs a DatagramPacket for receiving packets of length length, specifying an offset into the buffer.DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
          Constructs a datagram packet for sending packets of length length with offset ioffsetto the specified port number on the specified host.DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
          Constructs a datagram packet for sending packets of length length with offset ioffsetto the specified port number on the specified host.DatagramPacket(byte[] buf, int length, SocketAddress address)
          Constructs a datagram packet for sending packets of length length to the specified port number on the specified host.

可以看出,有两个供接收的构造器和四个供发送的构造器.其中,buf中存放数据报数据,length为数据报中数据的长度,address和port旨明目的地址,offset指明了数据报的位移量。

Java组播支持

MulticastSocket 多播数据报套接字。这个组播套接字对于收发IP多播数据包是很有用的,它扩展了DatagramSocket,在其上附加了加入internet上多播组的方法。一个多播组由D类IP地址和标准UDP端口指定,D类IP范围是224.0.0.0 to 239.255.255.255,其中224.0.0.0被保留不为它用。

它有三个构造器:

Constructor SummaryMulticastSocket()
          Create a multicast socket.MulticastSocket(int port)
          Create a multicast socket and bind it to a specific port.MulticastSocket(SocketAddress bindaddr)
          Create a MulticastSocket bound to the specified socket address. 

基本上,没有指定端口,只为发送,指定端口可收发,多址主机会用套接字地址。

时间: 2024-12-21 14:38:51

Java数据报编程之概说的相关文章

Java数据报编程之测试程序

编程|程序|数据   这里写得是后面数据报编程用到的测试程序,这个程序包括一套自定义事件,一个能滚动的显示图象的Java bean组件. 在面向对象的程序设计中,事件消息(Event Message)是对象间通信的基本方式.在图形用户界面程序中,GUI组件对象根据用户的交互产生各种类型的事件消息,这些事件消息由应用程序的事件处理代码捕获,在进行相应的处理后驱动消息响应对象做出反应. 对于本程序,需求是这样的:数据接收器把数据接收完毕时,要产生事件,该事件将激活事件处理器.为此要自定义相关对象类,

Java数据报编程之组播

编程|数据   在信息时代,网络技术应用已经很普通.其中很多应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在Internet上分发的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力.一种能最大限度地利用现有带宽的重要技术是IP组播. 1.IP组播技术的概念 IP组播技术,是一种允许一台或多台主机(组播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术,是一点对多点的通信.在网络多媒体广播的应用中,当需要将一个节点的信号传送到多个节

java数据报编程

大家迄今看到的例子使用的都是"传输控制协议"(TCP),亦称作"基于数据流的套接字".根据该协议的设计宗旨,它具有高度的可靠性,而且能保证数据顺利抵达目的地.换言之,它允许重传那些由于各种原因半路"走失"的数据.而且收到字节的顺序与它们发出来时是一样的.当然,这种控制与可靠性需要我们付出一些代价:TCP具有非常高的开销. 还有另一种协议,名为"用户数据报协议"(UDP),它并不刻意追求数据包会完全发送出去,也不能担保它们抵达的

Java数据报编程之广播

编程|数据   UDP广播,实际上是很简单的,理解IP编址方案,就理解什么是广播,很多文章称为多播,我认为称为广播比较好,因为多播是对广播和组播的泛指,在Java程序中处理自然是不同的了,本文和下一篇只为强调概念. 正如前面所说,广播地址包括定向广播地址和有限广播地址,TCP/IP协议规定,这两种地址只能在本地网络中出现,路由器执行了这个规定,不把目标地址为广播地址的报文转发到其它网络,而组播就不同,下一篇介绍组播编程. 这个广播的程序可以简单的通过修改单播程序中的报文的目标地址成广播地址即可成

Java数据报编程之单播

编程|数据   实际上,单播就是一个报文从源主机向另一个目标主机发送,接收目标只有一个. 首先,写收发器类DatagramRecvSender_s,这个类既要发送数据报又要接收数据报,发送一个文件夹中的所有图片,一张一张的进行,接收是在一个线程中进行,每收完一个文件,就激活一个事件,事件处理器处理这个事件. 类清单为: package recmail.multiservice; import java.net.DatagramPacket;import java.net.DatagramSock

【网络编程2】Java数据报套接字

这篇博文是本文学习<Java网络程序设计>书中第5章数据报套接字的学习总结.初学者网友学习这篇Java数据报套接字文章,如果难于理解文章前面理论部分,可以先运行后面的程序,边看运行后面的程序边理解前面的原理,这对初学者是最好的方法.所有源代码都在文章后面我的github链接代码中. --惠州学院13网络工程 吴成兵 20160609 目录 1 目录 1 一 数据报套接字概述 二 DatagramPacket 21 创建DatagramPacket对象 211 创建的DatagramPacket

Java socket编程入门

编程 第一章:学习提示 我适合学习这份教程吗 Socket提供了两台计算机之间进行通讯的机制,在James Gosling注意Java语言之前就已经很闻名了.Java语言使你更简单有效的使用Socket开发而无需了解操作系统的底层机制.大部分讨论Java编码的书籍都没有涉及这一主题,或者是只是"点到为止",留给读者大量的想象空间.这份教程就是让你了解在你的Java代码中如何更有效的使用Socket所需的知识.包含以下内容: •什么是Socket •它位于你的应用程序的哪些地方 •能正常

Java socket编程入门[1]

编程 第一章:学习提示 我适合学习这份教程吗 Socket提供了两台计算机之间进行通讯的机制,在James Gosling注意Java语言之前就已经很闻名了.Java语言使你更简单有效的使用Socket开发而无需了解操作系统的底层机制.大部分讨论Java编码的书籍都没有涉及这一主题,或者是只是"点到为止",留给读者大量的想象空间.这份教程就是让你了解在你的Java代码中如何更有效的使用Socket所需的知识.包含以下内容:•什么是Socket•它位于你的应用程序的哪些地方•能正常运行的

Java Socket编程(四)

编程 重复和并发服务器 所有的这些调用都可以掷出一个UnknownHostException违例.如果一台计算机没有连接上DNS服务器,或者主机的确没有找到,这个违例就会被掷出.如果一台计算机没有一个激活的TCP/IP配置,getLocalHost()也为失败并掷出一个违例. 一旦一个地址被确定了,数据报就可以被送出了.下面的程序传输了一个字符串给目的socket: String toSend = "This is the data to send!"); byte[] sendbuf