工具类
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 udpPort:UDP监听的端口,不写时,默认为文件下载的端口
* @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();
}
}
}
}