package testUDP;

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 < 1000; 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的

// 源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();

}

}


 

 



package testUDP;

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";
// 定义每个数据报的最大大小为4KB
private static final int DATA_LEN = 4*4096;
// 定义接收网络数据的字节数组
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,使用随机端口
DatagramSocket socket = 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);
// 发送数据报
socket.send(outPacket);
// 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组中
socket.receive(inPacket);
System.out.println(new String(inBuff , 0
, inPacket.getLength()));
}
}
}
public static void main(String[] args)
throws IOException
{
new UDPClient().init();
}
}