服务器端
public class UDPServer {
public static void main(String[]args) throws Exception{
byte[] buf = new byte[100];
//用来接收数据
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
DatagramSocket datagramSocket = new DatagramSocket(9995);
while(true){
//receive()方法是阻塞方法,如果没有收到信息会一直等待
//将接收的信息存放到datagramPacket当中
datagramSocket.receive(datagramPacket);
System.out.println("data is :" + new String(datagramPacket.getData()));
}
}
}
客户端
public class UDPClient {
public static void main(String[] args) throws Exception {
byte[] buf = new String("UDP TEST data from client").getBytes(); ;
DatagramPacket datagramPacket = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),9995);
DatagramSocket datagramSocket = new DatagramSocket();
//将datagramPacket数据传输到目标地址
datagramSocket.send(datagramPacket);
}
}
例子二(从疯狂JAVA中copy的)
package hb.udp;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.*;
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 < 1000; i++) {
// 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。阻塞等待
socket.receive(inPacket);
// 判断inPacket.getData()和inBuff是否是同一个数组
System.out.println(inBuff == inPacket.getData());
// 将接收到的内容转成字符串后输出
System.out.println(new String(inBuff, 1, inPacket.getLength()));
// 从字符串数组中取出一个元素作为发送的数据
byte[] sendData = books[i % 4].getBytes();
// 以指定字节数组作为发送数据、以刚接受到的DatagramPacket的
// 源SocketAddress作为目标SocketAddress创建DatagramPacket。
outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getSocketAddress());
// 发送数据
socket.send(outPacket);
}
}
// 使用finally块保证关闭资源
finally {
if (socket != null) {
System.out.println("udpserver close");
socket.close();
}
}
}
public static void main(String[] args) throws IOException {
new UdpServer().init();
}
}
package hb.udp;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.*;
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 socket = null;
// 定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
// 以指定字节数组创建准备接受数据的DatagramPacket对象
private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
// 定义一个用于发送的DatagramPacket对象
private DatagramPacket outPacket = null;
public void init() throws IOException {
try {
// 创建一个客户端DatagramSocket,使用随机端口
socket = new DatagramSocket();
// 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组
outPacket = new DatagramPacket(new byte[1024], 5, InetAddress.getByName(DEST_IP), DEST_PORT);
// 创建键盘输入流
Scanner scan = new Scanner(System.in);
// 不断读取键盘输入
while (scan.hasNextLine()) {
// 将键盘输入的一行字符串转换字节数组
byte[] buff = scan.nextLine().getBytes();
System.out.println("--------------"+buff[0]);
// 设置发送用的DatagramPacket里的字节数据
outPacket.setData(buff);
// 发送数据报
socket.send(outPacket);
// 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。
socket.receive(inPacket);
System.out.println(new String(inBuff, 0, inPacket.getLength()));
}
}
// 使用finally块保证关闭资源
finally {
if (socket != null) {
System.out.println("udpclient close");
socket.close();
}
}
}
public static void main(String[] args) throws IOException {
new UdpClient().init();
}
}