- /**
- * UDP开发,无连接的Socket操作采用UDP协议,一个数据报文是一个独立的单元,
- * 包含所有这次投递的信息:目的地址和要发送的内容。
- * UDP模式下,Socket不需要连接到一个目的地Socket,只是简单的投出数据
- * 无连接的操作是高效和快速的,但是数据传输的可靠性不佳
- * 常用于音频和视频的传输,偶尔丢失一两个数据包,不会对接受效果产生很大的影响
- * UDP不提供数据的分组,不能对数据包进行排序,报文发出后,无法得知其是否安全到达
- *
- * UDP数据的接受方
- *
- * 需要接受侦听的端口号作为输入参数
- * */
- import java.net.InetAddress;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- public class UDPReceive {
- public static void main(String args[]) {
- try {
- if (args.length != 1)
- throw new IllegalArgumentException("Wrong number of args");
- int port = Integer.parseInt(args[0]);
- DatagramSocket dsocket = new DatagramSocket(port);// 创建实例,并固定监听port端口的报文
- byte[] buffer = new byte[2048];// 接受的数据存放到buffer的字节数组当中
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length);// 处理报文
- for (;;) {
- dsocket.receive(packet);// 接受数据报文到packet中,产生一个阻塞,
- // 程序运行到这执行内部的循环,直到特定的事件被触发
- String msg = new String(buffer, 0, packet.getLength());
- System.out.println(packet.getAddress().getHostName() + ": "
- + msg);
- packet.setLength(buffer.length);
- }
- } catch (Exception e) {
- System.err.println(e);
- }
- }
- }
- /**
- * UDP数据的发送方
- *
- * 需要接受3个输入参数,目标主机名、目标端口号、要发送的字符串 作为输入参数
- * */
- import java.net.InetAddress;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- public class UDPSend
- {
- public static void main(String args[])
- {
- try
- {
- if (args.length < 3)
- throw new IllegalArgumentException("Wrong number of args");
- String host = args[0];
- int port = Integer.parseInt(args[1]);
- byte[] message;
- String msg = args[2];
- message = msg.getBytes();
- InetAddress address = InetAddress.getByName(host);
- DatagramPacket packet = new DatagramPacket(message, message.length,address, port);
- //处理报文
- DatagramSocket dsocket = new DatagramSocket(); // 创建实例,没有特定监听的端口,用出客户端的编程
- dsocket.send(packet);//发送报文到packet
- dsocket.close();//关闭 DatagramSocket
- }
- catch (Exception e)
- {
- System.err.println(e);
- }
- }
- }