UDP 基础 1

工具类

import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.net.*;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.ResourceBundle;

/**
 * Created by Administrator on 2018/3/27 0027.
 * UDP工具类
 */
public class UDPUtils {
    /**udpListenPort:下载文件的客户端监听的Udp端口
     * resourceService:随着类的工具类的加载而一次性赋值给它,之后直接传入到ResourceProcessThread中去做操作
     */
    private static final String udpListenPort;
    private static final String serverUdpListenPort;
    static {
        ResourceBundle resourceBundle = ResourceBundle.getBundle("systemConfig");
        udpListenPort = resourceBundle.getString("udpListenPort");
        serverUdpListenPort = resourceBundle.getString("serverUdpListenPort");
    }

    /**
     * 给指定ip指定端口发送udp消息
     *
     * @param ip:指定ip
     * @param udpPortUDP监听的端口,不写时,默认为文件下载的端口
     * @param msg:待发送的消息
     * @return
     */
    public static final void sendUdpMsgToIp(String ip, Integer udpPort, String msg) {
        DatagramSocket datagramSocket = null;
        if (udpPort == null) {
            udpPort = Integer.parseInt(udpListenPort);
        }
        try {
            if (StringUtils.isNotBlank(msg) && StringUtils.isNotBlank(ip) && StringUtils.isNotBlank(udpPort + "")) {
                datagramSocket = new DatagramSocket();
                byte[] msgBytes = msg.getBytes("UTF-8");
                InetAddress inetAddress = InetAddress.getByName(ip);
                DatagramPacket datagramPacket = new DatagramPacket(msgBytes,
                        msgBytes.length, inetAddress, udpPort);
                datagramSocket.send(datagramPacket);
                datagramSocket.disconnect();
                datagramSocket.close();
                System.out.println("send udp msg finish:" + datagramPacket.getAddress().getHostAddress() + ",clientPort:" + datagramPacket.getPort() + ",sendMessage:" + msg);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (datagramSocket != null) {
                if (!datagramSocket.isConnected()) {
                    datagramSocket.disconnect();
                }
                if (!datagramSocket.isClosed()) {
                    datagramSocket.close();
                }
            }
        }
    }

    /**
     * UDP服务端监听本地指定端口
     */
    public static final void udpServiceListener() {
        DatagramSocket datagramSocket = null;
        /** 数据接收大小设置为1024字节,超出部分是接收不到的
         */
        byte[] buffer = new byte[1024];
        DatagramPacket datagramPacket;
        try {
            /**缺省ip时,默认是本机ip*/
            datagramSocket = new DatagramSocket(Integer.parseInt(serverUdpListenPort));
            datagramPacket = new DatagramPacket(buffer, buffer.length);
            while (true) {
                /**当前线程仍然与UDPServiceThread线程一致*/
                System.out.println(new Date() + " :com.lct.utils.UDPUtils,当前线程:" + Thread.currentThread().getName());
                System.out.println(" receive messages: Start successful, start UDP monitor,serverUdpListenPort:"+serverUdpListenPort);
                /**循环监听*/
                datagramSocket.receive(datagramPacket);
                /**读取数据*/
                String message = new String(datagramPacket.getData(), 0, datagramPacket.getLength(), Charset.forName("UTF-8"));
                System.out.println("message:"+message);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (datagramSocket != null) {
                if (!datagramSocket.isConnected()) {
                    datagramSocket.disconnect();
                }
                if (!datagramSocket.isClosed()) {
                    datagramSocket.close();
                }
                /**即使抛异常了,也要再次监听*/
                udpServiceListener();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/80816039