Java数据报(UDP)编程
来源:互联网 发布:个人淘宝开店流程 编辑:程序博客网 时间:2024/05/02 08:35
一般说明
在TCP/IP协议族中,UDP和TCP同样位于传输层,用户数据报是UDP协议中的概念.
UDP协议提供面向事务的简单不可靠信息传送服务,它不提供对 IP 协议的可靠机制、流控制以及错误恢复功能.
UDP 协议基本上是IP 协议与上层协议的接口,从整个用户数据在各层的包装看,UDP报文格式相当简单:
16 32bit Source 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 Summary
DatagramPacket(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 ioffset
to 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 ioffset
to 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 Summary
MulticastSocket()
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.
基本上,没有指定端口,只为发送,指定端口可收发,多址主机会用套接字地址。
一,DatagramSocket类;DatagramPacket类;InetAddress 类
构造函数 public DatagramSocket();public DatagramSocket(int port);
public DatagramSocket(InetAddress laddr);
close()方法
send(DatagramPacket p)
receive(DatagramPacket p)
接受方的DatagramPacket public DatagramPacket(byte[] buf, int length)发送方的DatagramPacket public DatagramPacket(byte[] buf, int length, InetAddress address, int port
最简单的UDP程序:
发送程序:UdpSend.java
public class UdpSend
...{
public static void main(String [] args) throws Exception
...{
DatagramSocket ds=new DatagramSocket();
String str="hello world";
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),
InetAddress.getByName("192.168.0.25"),3000);
ds.send(dp);
ds.close();
}
}
接收程序:UdpRecv.java
public class UdpRecv
...{
public static void main(String [] args) throws Exception
...{
DatagramSocket ds=new DatagramSocket(3000);
byte [] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
ds.receive(dp);
String strRecv=new String(dp.getData(),0,dp.getLength()) +
" from " + dp.getAddress().getHostAddress()+":"+dp.getPort();
System.out.println(strRecv);
ds.close();
}
}
- Java数据报(UDP)编程
- 【网络编程】UDP数据报格式
- python 网络编程(udp数据报)
- java实现UDP广播数据报
- Java 网络编程(六) 使用无连接的数据报(UDP)进行通信
- 通过Socket实现UDP(用户数据报)编程
- 数据报(UDP)套接字客户端/服务器编程
- 【Linux网络编程】TCP 和 UDP 数据报格式详解
- UDP(用户数据报协议)和套接字编程
- UDP发数据报
- UDP数据报
- UDP接收数据报
- UDP:用户数据报
- UDP:用户数据报
- java,tcp的socket,udp的数据报
- [疯狂Java]UDP:接收发送数据报、获取接收到的数据报的相关信息
- 最大UDP数据报长度
- UDP用户数据报协议
- 收藏一个winform例子
- EMR 工业品生产、销售行业解决方案
- Java学习之路:不走弯路,就是捷径
- 以编程方式创建用户控件
- 基于组件技术的C#开发 --委托
- Java数据报(UDP)编程
- Eclipse资源收集
- 程序员怎么样才能保证自己的程序没有BUG
- 高质量C++/C编程指南 -- 第1章 文件结构
- Server.Transfer,Response.Redirect的区别
- 深入浅出设计模式-学习笔记(1) Strategy
- 迷惘的周五
- EMR咨询服务行业解决方案
- 在C#中创建自定义控件