问题很简单,后来才发现,因为udp的采集程序是阻塞线程的,如下:
//创建数据包对象,传递字节数组
DatagramPacket dp=new DatagramPacket(data, data.length);
//调用ds对象的方法receive传递数据包
try {
ds.receive(dp);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//获取发送端的IP地址对象
String ip=dp.getAddress().getHostAddress();
System.out.println(ip);
//获取发送的端口号
int port=dp.getPort();
System.out.println(port);
// //获取接收到的字节数
// int length=dp.getLength();
if(ip.equals(mip)&&port==mport) {
byte[] Timedata = dp.getData();
String TimeDateString;
try {
TimeDateString = new String(Timedata,"ascii");
logger.info(TimeDateString);
System.out.println(trans);
try {
WebSocketServer.sendInfo(trans);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
如果你一旦启用了udp,就把整个线程给堵塞了,直到收到udp包为止,因此,正确的用法是给udp单独一个线程。
class UDPProcess implements Runnable{
//创建数据包传输对象DatagramSocket 绑定端口号
DatagramSocket ds=null;
public UDPProcess(String mip,int mport,int localport) throws SocketException {
// TODO Auto-generated constructor stub
ds=new DatagramSocket(localport);
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("======UDPProcess=====");
//创建字节数组
byte[] data=new byte[1024];
while(true) {
logger.info("UDP接收端 is reveiving");
//创建数据包对象,传递字节数组
DatagramPacket dp=new DatagramPacket(data, data.length);
//调用ds对象的方法receive传递数据包
try {
ds.receive(dp);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//获取发送端的IP地址对象
String ip=dp.getAddress().getHostAddress();
System.out.println(ip);
//获取发送的端口号
int port=dp.getPort();
System.out.println(port);
// //获取接收到的字节数
// int length=dp.getLength();
if(ip.equals(mip)&&port==mport) {
byte[] Timedata = dp.getData();
String TimeDateString;
try {
TimeDateString = new String(Timedata,"ascii");
logger.info(TimeDateString);
try {
WebSocketServer.sendInfo(trans);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
}
//启用
@Override
public void run(ApplicationArguments args) throws Exception {
// TODO Auto-generated method stub
System.out.println("=====UDP LISTENER INITIALIZED=====");
if(UpOr.equals("up")) {
try {
System.out.println(mip);
System.out.println(mport);
System.out.println(localport);
new Thread(new UDPProcess(mip,mport,localport)).start();
} catch (Exception e) {
// TODO: handle exception
}
}
}
网上有一种用ServletContextListener来实现的,我试了,实现了需要的功能,但是也有问题,在ServletContextListener中,调用参数都是要加final的,因此就不能从yml的配置文件中取值,于是我还是选择继承ApplicationRunner。