基于UDP协议的数据交互例子
直接贴上代码:
客户端:
package com.example;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.util.Scanner;public class UdpClient {/** 定义发送数据报的目的地. */public static final int DEST_PORT = 30000;public static final String DEST_IP = "127.0.0.1";/** 定义每个数据报的最大大小为4K */private static final int DATA_LEN = 4096;/** 定义该客户端使用的DatagramSocket,它的唯一作用就是接收和发送数据 报. */private DatagramSocket mSocket = null;/** 定义接收网络数据的字节数组 */byte[] inBuff = new byte[DATA_LEN];/** 以指定字节数组创建准备接受数据的DatagramPacket对象. Java使用 DatagramPacket来代表数据报. */private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);/** 定义一个用于发送的DatagramPacket对象 */private DatagramPacket outPacket = null;public void init() throws IOException {try {/** * DatagramSocket(): * <p> * 创建一个DatagramSocket实例,并将该对象绑定到 本机默认IP地址、本机所有可用端口中随机选择的 某个端口。 * <p> * DatagramSocket(int prot): * <p> * 创建一个DatagramSocket实例,并将该对象绑定到 本机默认IP地址、指定端口。 * <p> * DatagramSocket(int port, InetAddress laddr): * <p> * 创建一个DatagramSocket实例,并将该对象绑定到 指定IP地址、指定端口。 */mSocket = new DatagramSocket();/** 初始化发送用的DatagramSocket,它包含一个长度 为0的字节数组. */outPacket = new DatagramPacket(new byte[0], 0, InetAddress.getByName(DEST_IP), DEST_PORT);/** 创建键盘输入流. */Scanner scan = new Scanner(System.in);/** 不断读取键盘输入. */while (scan.hasNextLine()) {/** 将键盘输入的一行字符串转换字节数组 */byte[] buff = scan.nextLine().getBytes();/** 设置发送用的DatagramPacket里的字节数据 */outPacket.setData(buff);/** 发送数据报 */mSocket.send(outPacket);/** 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里. */mSocket.receive(inPacket);System.out.println(new String(inBuff, 0, inPacket.getLength()));}}/** 使用finally块保证关闭资源. */finally {if (mSocket != null) {mSocket.close();}}}public static void main(String[] args) throws IOException {new UdpClient().init();}}
package com.example;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;public class UdpServer {public static final int PORT = 30000;/** 定义每个数据报的最大大小为4K. */private static final int DATA_LEN = 4096;/** 定义该服务器使用的DatagramSocket. */private DatagramSocket socket = null;/** 定义接收网络数据的字节数组. */byte[] inBuff = new byte[DATA_LEN];/** 以指定字节数组创建准备接受数据的DatagramPacket对象. */private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);/** 定义一个用于发送的DatagramPacket对象. */private DatagramPacket outPacket;/** 定义一个字符串数组,服务器发送该数组的的元素. */String[] books = new String[] { "轻量级J2EE企业应用实战", "基于J2EE的Ajax宝典", "Struts2权威指南", "ROR敏捷开发最佳实践" };public void init() throws IOException {try {/** 创建DatagramSocket对象. */socket = new DatagramSocket(PORT);/** 采用循环接受数据. */for (int i = 0; i < 10; i++) {/** 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里. */socket.receive(inPacket);/** 判断inPacket.getData()和inBuff是否是同一个数组. */System.out.println(inBuff == inPacket.getData());/** 将接收到的内容转成字符串后输出. */System.out.println(new String(inBuff, 0, inPacket.getLength()));/** 从字符串数组中取出一个元素作为发送的数据. */byte[] sendData = books[i % 4].getBytes();/** * 以指定字节数组作为发送数据、以刚接受到的DatagramPacket的源 * <p> * SocketAddress作为目标SocketAddress创建DatagramPacket. */outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getSocketAddress());/** 发送数据. */socket.send(outPacket);}}/** 使用finally块保证关闭资源. */finally {if (socket != null) {socket.close();}}}public static void main(String[] args) throws IOException {new UdpServer().init();}}