基于UDP协议的网络编程(施用DatagramSocket发送接收数据)

基于UDP协议的网络编程(使用DatagramSocket发送接收数据)
一:UDP服务器端
package socketServer;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/***
* UDP 协议传输数据(服务器)
**/
public class UdpServer {
public static final int PORT = 30001;
// 定义每个数据报的最大大小为4K
public 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("---判断inPacket.getData()和inBuff是否是同一个数组 -----------" + 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);
   }
} catch (SocketException e) {
   e.printStackTrace();
  } finally {
   if (socket != null) {
    socket.close();
   }
  }
}
public static void main(String[] args) throws IOException {
  new UdpServer().init();
}
}

二:UDP客户端
package socketClient;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class UdpClient {
/**
  *  UDP 协议传输数据(客户端)
  */
//定义发送数据报的目的地
public static final int DEST_PORT=30001;
public static final String DEST_IP="127.0.0.1";
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);
private DatagramPacket outPacket=null;

public void init() throws IOException{
  try {
   //使用随机端口
   socket=new DatagramSocket();
   //初始化发送用的DatagramPacket
   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();
    //填充发送用的数据
    outPacket.setData(buff);
        // 发送数据报
    socket.send(outPacket);
    //读取socket中的数据,读到的数据放在inPacket所封装的字节数据里面
    socket.receive(inPacket);
    System.out.println("-------服务器返回的数据:"+new String(inBuff,0,inPacket.getLength())+"------");
   }
  
  } catch (SocketException e) {
   e.printStackTrace();
  }finally{
   if(socket!=null){
    socket.close();
   }
  }
 
}
public static void main(String[] args) throws IOException {
  new UdpClient().init();
}
}