UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送、接收数据报的对象。

Java使用DatagramSocket代表基于UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报。Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送数据都是通过DatagramPacket对象完成的。

DatagramSocket有4个构造器:

1.DatagramSocket():创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、本机所有可用端口中随机选择的一个端口

2.DatagramSocket(int port):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口

3.DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口

4.DatagramSocket(SocketAddress bindaddr):创建一个DatagramSocket实例,并绑定一个SocketAddress实例

使用DatagramSocket对象的send(DatagramPacket p)方法来发送数据,使用DatagramSocket对象的receive(DatagramPacket p)方法来接收数据,如果没有接受到数据,则会一直阻塞线程,直接接受到数据。

DatagramPacket构造器分为两类:

参数列表有InetAddress实例或者SocketAddress实例的,常用的是DatagramPacket(byte buf[], int length, InetAddress address, int port)。这类构造器指定目的IP和目的端口,创建出的DatagramPacket实例用来包装待发送的数据,并当做参数传到DatagramSocket实例的send方法中。

参数列表没有InetAddress实例和SocketAddress实例的,常用的是DatagramPacket(byte buf[], int length)。用这类构造器创建出来的DatagramPacket实例用来接收数据,被当做参数传到DatagramSocket实例的receive方法中。

发送方代码示例:

public class UDPSend {
public static void main(String args[]) {
try {
// 创建DatagramSocket实例
DatagramSocket socket = new DatagramSocket(9999);
String text = "hello world";
byte[] bytes = text.getBytes();
// 发送方的数据报实例包装待发送的数据,并指定目的IP和目的端口
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 10000);
// 发送数据报
socket.send(packet);
// 关闭socket资源
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

发送方代码中涉及到了两个端口,一个是本身发送数据的端口,另一个是指定了向目标主机目标端口发送数据。

接收方代码示例:

public class UDPReceive {
public static void main(String[] args) {
try {
// 创建DatagramSocket实例,指定用来接收数据的端口是10000
DatagramSocket socket = new DatagramSocket(10000);
// 创建一个空的字节数组,字节数组的长度决定了
byte[] buf = new byte[1024];
// 创建接收方数据报实例时传入一个空的字节数组,该数据的长度决定了数据报实例最多能接受多少数据
DatagramPacket packet = new DatagramPacket(buf, buf.length);
// 接收数据
socket.receive(packet);
// 把字节数据封装成字符串。packet.getLength()返回接收数据的实际长度
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println(msg);
// 关闭socket资源
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

接收方中的DatagramSocket对象的receive(DatagramPacket p)方法会阻塞线程,等待数据的来临,一旦接收到数据,线程结束。

以上,不管先运行发送方还是先运行接收方都不会报错。其实UDP传输就好像对讲机一样,没有打开接收,除了别人说的话听不到以外,不会有任何异常,那边说话的人该说说,只是信息丢了。只有打开了接收,才能听得到别人说话。类似的,如果先运行发送方的话,发送方朝目的主机、目的端口发送了一条消息后结束,但是由于目的主机没有在指定端口接收数据的程序,所以消息丢了。如果这时候再运行接收方代码,则会阻塞,直到在指定端口接收到了数据,也就是说又有数据被发送到了指定端口上。

DatagramPacket对象还有几个额外的方法比较实用:

1.InetAddress getAddress():发送方的DatagramPacket对象调用时,该方法返回数据报的目的IP;接收方的DatagramPacket对象调用时,该方法返回发送方的IP地址

2.getPort():发送方的调用时,返回目的端口;接收方调用时,返回发送方的端口

基于UDP协议的网络编程的更多相关文章

  1. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  2. 基于UDP协议的socket编程

    UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启 ...

  3. 初识Socket通信:基于TCP和UDP协议学习网络编程

    学习笔记: 1.基于TCP协议的Socket网络编程: (1)Socket类构造方法:在客户端和服务器端建立连接 Socket s = new Socket(hostName,port);以主机名和端 ...

  4. UNIX网络编程——基于UDP协议的网络程序

    一.下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器: #include <sys/types.h> #include <sys/so ...

  5. 基于UDP协议的网络程序

    一.下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器 #include <sys/types.h>  #include <sys/so ...

  6. 基于TCP协议的网络编程

    TCP通信协议是一种可靠的传输层协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成虚拟网络链路.一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信.Java使用Socke ...

  7. 学习笔记——网络编程3(基于TCP协议的网络编程)

    TCP协议基础 IP协议是Internet上使用的一个关键协议,它的全称是Internet Protocol,即Internet协议,通常简称IP协议.   使用ServerSocket创建TCP服务 ...

  8. UDP协议的网络编程

    public class UDPTest { //发送端@Testpublic void sender() throws IOException { DatagramSocket socket = n ...

  9. 基于UDP协议的socket编程示例

    客户端 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; impo ...

随机推荐

  1. [Android学习笔记4]四大应用组件之一:Service 上

    一.什么是Service 一个Service就是一个能够在后台执行长时操作的应用程序组件,并且不提供用户界面.一个应用程序组件能够启动一个Service,即使用户切换到另一个应用程序,这个Servic ...

  2. 主引导记录MBR/硬盘分区表DPT/主分区、扩展分区和逻辑分区/电脑启动过程

    主引导扇区主引导扇区位于整个硬盘的0柱面0磁头1扇区{(柱面,磁头,扇区)|(0,0,1)},bios在执行自己固有的程序以后就会jump到MBR中的第一 条指令.将系统的控制权交由mbr来执行.主引 ...

  3. Linux进程分配内存的两种方式--brk() 和mmap()

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  4. Servlet的ClassLoader

    摘自深入java web技术内幕修订版

  5. Kettle的应用——对mysql数据进行表输入与导出

    Kettle的应用——对mysql数据进行表输入与导出 1. 下载好kettle解压包 网址:http://sourceforge.net/projects/pentaho/files/Data%20 ...

  6. LaTeX入门教程(二)

    LaTeX(LATEX,音译"拉泰赫")是一种基于ΤΕΧ的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在20世纪80年代初期开发,利用这种格式,即使使用 ...

  7. java基础练习 3

    import java.util.Scanner; public class Third { /*计算字符串中子串出现的次数 (5 分数)*/ public static void main(Stri ...

  8. Xshell和VirtualBox虚机CentOS7的连接

    后面的不能连接问题,出处为 http://m.blog.csdn.net/article/details?id=52755571 1.centos7的ip ,这里的enp0s3相当于eth0,是一个默 ...

  9. 在转换为 UTC 时大于 DateTime.MaxValue 或小于 DateTime.MinValue 的 DateTime 值无法系列化为 JSON

    看到这个错往往会感到莫名其妙! 其原因其实是数据库的DateTime最小值和C#的DateTime不一样 Sql Server DateTime 类型必须介于 1/1/1753 12:00:00 AM ...

  10. 中国IT武林大会暨中国首席技术官2016年度人物颁奖盛典概况

    在"大众创业.万众创新"的互联网时代,深入实施创新驱动发展战略,建设创新型国家,必须大力推动"互联网+科技"的发展.由中国首席技术官联盟.CCTV证券频道< ...