在tomcat中部署springboot的udp持续接收的项目,加载不出网页

问题很简单,后来才发现,因为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。

猜你喜欢

转载自blog.csdn.net/baidu_31788709/article/details/104526084
今日推荐