UDP协议java测试案例

来源:互联网 发布:阿里云修改主机名 编辑:程序博客网 时间:2024/04/29 07:45
package handler;


import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.*;


/**
 * UDP客户端和服务端测试案例
 * Created by Administrator on 2016-11-25.
 */
public class UDPTest {
    public static void main(String[] args) throws IOException {
       client();
    }


    /**
     * UDP客户端发送数据,和接收服务端返回的数据
     * @throws IOException
     */
    public static void client() throws IOException {
        int TIMEOUT = 5000;  //设置接收数据的超时时间
        int MAXNUM = 5;      //设置重发数据的最多次数
        String str_send = "Hello this client";
        byte[] buf = new byte[1024];
        //客户端在9000端口监听接收到的数据
        DatagramSocket ds = new DatagramSocket(9000);
        InetAddress loc = InetAddress.getByName("10.0.0.1");
        //定义用来发送数据的DatagramPacket实例    参数:信息byte[],信息长度,服务端IP,服务端监听端口
        DatagramPacket dp_send= new DatagramPacket(str_send.getBytes(),str_send.length(),loc,10006);
        //定义用来接收数据的DatagramPacket实例
        DatagramPacket dp_receive = new DatagramPacket(buf, 1024);
        ds.setSoTimeout(TIMEOUT);              //设置接收数据时阻塞的最长时间
        int tries = 0;                         //重发数据的次数
        boolean receivedResponse = false;     //是否接收到数据的标志位
        //直到接收到数据,或者重发次数达到预定值,则退出循环
        while(!receivedResponse && tries<MAXNUM){
            //发送数据
            ds.send(dp_send);
            try{
                System.out.println("发送数据成功");
                //接收从服务端发送回来的数据
                ds.receive(dp_receive);
                //如果接收到的数据不是来自目标地址,则抛出异常
                if(!dp_receive.getAddress().equals(loc)){
                    throw new IOException("Received packet from an umknown source");
                }
                //如果接收到数据。则将receivedResponse标志位改为true,从而退出循环
                receivedResponse = true;
            }catch(InterruptedIOException e){
                //如果接收数据时阻塞超时,重发并减少一次重发的次数
                tries += 1;
                System.out.println("Time out," + (MAXNUM - tries) + " more tries..." );
            }
        }
        if(receivedResponse){
            //如果收到数据,则打印出来
            String str_receive = new String(dp_receive.getData(),0,dp_receive.getLength()) +
                    " from " + dp_receive.getAddress().getHostAddress() + ":" + dp_receive.getPort();
            System.out.println(str_receive);
            //由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,
            //所以这里要将dp_receive的内部消息长度重新置为1024
            dp_receive.setLength(1024);
        }else{
            //如果重发MAXNUM次数据后,仍未获得服务器发送回来的数据,则打印如下信息
            System.out.println("No response -- give up.");
        }
        ds.close();
    }


    /**
     * UDP服务端接收数据,和返回数据到客户端
     * @throws IOException
     */
    public static void server() throws IOException {
        String str_send = "Hello world";
        byte[] buf = new byte[1024];
        //服务端在10006端口监听接收到的数据
        DatagramSocket ds = new DatagramSocket(10006);
        //接收从客户端发送过来的数据
        DatagramPacket dp_receive = new DatagramPacket(buf, 1024);
        boolean f = true;
        while(f){
            //服务器端接收来自客户端的数据
            ds.receive(dp_receive);
            System.out.println("server received data from client:");
            String str_receive = new String(dp_receive.getData(),0,dp_receive.getLength()) +
                    " from " + dp_receive.getAddress().getHostAddress() + ":" + dp_receive.getPort();
            System.out.println(str_receive);
            //数据发动到客户端的3000端口
            DatagramPacket dp_send= new DatagramPacket(str_send.getBytes(),str_send.length(),dp_receive.getAddress(),9000);
            ds.send(dp_send);
            //由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,
            //所以这里要将dp_receive的内部消息长度重新置为1024
            dp_receive.setLength(1024);
        }
        ds.close();
    }
}
0 0
原创粉丝点击