1. 程式人生 > 程式設計 >Java基於ServletContextListener實現UDP監聽

Java基於ServletContextListener實現UDP監聽

這篇文章主要介紹了Java基於ServletContextListener實現UDP監聽,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

使用spring boot實現專案啟動時的監聽,

UDPListener

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class UDPListener implements ServletContextListener {

  public static final int MAX_UDP_DATA_SIZE = 4096;
  public static final int UDP_PORT = 26666;

  @Override
  public void contextInitialized(ServletContextEvent sce) {

    System.out.println("========UDPListener Initialized=========");
    try {
       // 啟動一個執行緒,監聽UDP資料報
      new Thread(new UDPProcess(UDP_PORT)).start();
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  class UDPProcess implements Runnable {
    DatagramSocket socket = null;

    public UDPProcess(final int port) throws SocketException {
      socket = new DatagramSocket(port);
    }

    @Override
    public void run() {
      // TODO Auto-generated method stub
      System.out.println("=======UDPProcess======");
      while (true) {
        byte[] buffer = new byte[MAX_UDP_DATA_SIZE];
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
        try {
          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
      byte[] buffer = packet.getData();// 接收到的UDP資訊,然後解碼
      String srt1 = new String(buffer,"GBK").trim();
      String srt2 = new String(buffer,"UTF-8").trim();
      String srt3 = new String(buffer,"ISO-8859-1").trim();
      System.out.println("=======Process srt1 GBK======" + srt1);
      System.out.println("=======Process srt2 UTF-8======" + srt2);
      System.out.println("=======Process srt3 ISO-8859-1======" + srt3);
    }

    @Override
    public void run() {
      // TODO Auto-generated method stub
      System.out.println("====Process run=====");
    }
    
  }

  @Override
  public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("========UDPListener Destroyed=========");
  }

}

DemoApplication

@SpringBootApplication
@ServletComponentScan 
public class DemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class,args);
  }
}

@ServletComponentScan Servlet掃描,啟動時把servlet、filter、listener自動掃描注入

UDP測試客戶端(也可以用測試工具傳送UDP包測試):

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClientTest {

  public static final String SERVER_HOSTNAME = "localhost";
  // 伺服器埠
  public static final int SERVER_PORT = 26666;
  // 本地傳送埠
  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 = "你好,世界".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();
    }
  }

}

結果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。