자바,ServletContextListener 기반 UDP 감청 실현

이 글 은 자바 가 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();
    }
  }

}
결과:

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기