基于UDP协议的数据交互事例
基于UDP协议的数据交互例子
直接贴上代码:
客户端:
服务器端:
最后说一句:此时服务器端的循环只有10次,在接受了10次数据后,Server端就不能接受到数据了.这个要注意一下.更详细点得描述,可以浏览这个地址:
http://hxdawxyhxdawxy.iteye.com/blog/1291266
总结一下:
客户端与服务器端的唯一区别在于:服务器所在IP地址、端口是固定的,所以客户端可以直接将该数据报发送给服务器,而服务器则需要根据接收到的数据报来决定将"反馈"数据报的目的地.
直接贴上代码:
客户端:
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(); } }
最后说一句:此时服务器端的循环只有10次,在接受了10次数据后,Server端就不能接受到数据了.这个要注意一下.更详细点得描述,可以浏览这个地址:
http://hxdawxyhxdawxy.iteye.com/blog/1291266
总结一下:
客户端与服务器端的唯一区别在于:服务器所在IP地址、端口是固定的,所以客户端可以直接将该数据报发送给服务器,而服务器则需要根据接收到的数据报来决定将"反馈"数据报的目的地.