java spring boot實現實時udp 監聽

java 實現實時udp 監聽

因項目需要對接高頻讀卡器使用udp傳輸數據,後臺要實時監聽處理
1、監聽類

package com.ruoyi.controller.Listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.logging.Logger;

/**
 * udp監聽
 * @author fjh
 */

/*
 * 服務器端,實現基於UDP的用戶登陸
 */
@WebListener
public class UDPListener implements ServletContextListener {
    public static Logger logger = Logger.getLogger(UDPListener.class.getName());
    public static final int MAX_UDP_DATA_SIZE = 4096;
    public static final int UDP_PORT = 26667;
    public static DatagramPacket packet = null;
    public static DatagramSocket socket = null;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        try {
            logger.info("========啓動一個線程,監聽UDP數據報.PORT:" + UDP_PORT + "=========");
            // 啓動一個線程,監聽UDP數據報
            new Thread(new UDPProcess(UDP_PORT)).start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    class UDPProcess implements Runnable {

        public UDPProcess(final int port) throws SocketException {
            //創建服務器端DatagramSocket,指定端口
            socket = new DatagramSocket(port);
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            logger.info("=======創建數據報,用於接收客戶端發送的數據======");
            while (true) {
                byte[] buffer = new byte[MAX_UDP_DATA_SIZE];
                packet = new DatagramPacket(buffer, buffer.length);
                try {
                    logger.info("=======此方法在接收到數據報之前會一直阻塞======");
                    socket.receive(packet);
                    new Thread(new Process(packet)).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    class Process implements Runnable {
        public Process(DatagramPacket packet) throws UnsupportedEncodingException {
            // TODO Auto-generated constructor stub
            logger.info("=======接收到的UDP信息======");
            byte[] buffer = packet.getData();// 接收到的UDP信息,然後解碼
//            String srt1 = new String(buffer, "GBK").trim();
            //            logger.info("=======Process srt1 GBK======" + srt1);
            String srt2 = new String(buffer, "UTF-8").trim();
            logger.info("=======Process srt2 UTF-8======" + srt2);
//            String srt3 = new String(buffer, "ISO-8859-1").trim();
//            logger.info("=======Process srt3 ISO-8859-1======" + srt3);
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            logger.info("====過程運行=====");
            try {
                logger.info("====向客戶端響應數據=====");
                //1.定義客戶端的地址、端口號、數據
                InetAddress address = packet.getAddress();
                int port = packet.getPort();
                byte[] data2 = "{'request':'alive','errcode':'0'}".getBytes();
                //2.創建數據報,包含響應的數據信息
                DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
                //3.響應客戶端
                socket.send(packet2);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
       logger.info("========UDPListener摧毀=========");
    }


}

2、配置啓動項目時啓動監聽

/**
 * 啓動程序
 * 
 * @author fjh
 */
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@ServletComponentScan
public class Application
{
    public static void main(String[] args)
    {
        // System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(Application.class, args);
        System.out.println(" 啓動成功゙  \n";
    }
}

3、發送測試demo

package com.ruoyi.controller;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class test {
    public static final String SERVER_HOSTNAME = "localhost";
    // 服務器端口
    public static final int SERVER_PORT = 26667;
    // 本地發送端口
    public static final int LOCAL_PORT = 8888;

    public static void main(String[] args) {
        try {
            // 1,創建udp服務。通過DatagramSocket對象。
            DatagramSocket socket = new DatagramSocket(LOCAL_PORT);
            // 2,確定數據,並封裝成數據包。DatagramPacket(byte[] buf, int length, InetAddress
            // address, int port)
            byte[] buf = "fengyanzushuaideyipi".getBytes();
            DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName(SERVER_HOSTNAME),
                    SERVER_PORT);
            // 3,通過socket服務,將已有的數據包發送出去。通過send方法。
            socket.send(dp);
            // 4,關閉資源。
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章