Java基于ServletContextListener實(shí)現(xiàn)UDP監(jiān)聽
這篇文章主要介紹了Java基于ServletContextListener實(shí)現(xiàn)UDP監(jiān)聽,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
使用spring boot實(shí)現(xiàn)項(xiàng)目啟動時的監(jiān)聽,
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 {
// 啟動一個線程,監(jiān)聽UDP數(shù)據(jù)報
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測試客戶端(也可以用測試工具發(fā)送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";
// 服務(wù)器端口
public static final int SERVER_PORT = 26666;
// 本地發(fā)送端口
public static final int LOCAL_PORT = 8888;
public static void main(String[] args) {
try {
// 1,創(chuàng)建udp服務(wù)。通過DatagramSocket對象。
DatagramSocket socket = new DatagramSocket(LOCAL_PORT);
// 2,確定數(shù)據(jù),并封裝成數(shù)據(jù)包。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服務(wù),將已有的數(shù)據(jù)包發(fā)送出去。通過send方法。
socket.send(dp);
// 4,關(guān)閉資源。
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
結(jié)果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis實(shí)現(xiàn)批量插入方法實(shí)例
最近在公司項(xiàng)目開發(fā)中遇到批量數(shù)據(jù)插入或者更新,下面這篇文章主要給大家介紹了關(guān)于MyBatis實(shí)現(xiàn)批量插入的相關(guān)資料,需要的朋友可以參考下2022-10-10
Java如何自定義類數(shù)組的創(chuàng)建和初始化
這篇文章主要介紹了Java如何自定義類數(shù)組的創(chuàng)建和初始化,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java?9中List.of()的使用示例及注意事項(xiàng)
Java 9引入了一個新的靜態(tài)工廠方法List.of(),用于創(chuàng)建不可變的列表對象,這篇文章主要介紹了Java?9中List.of()的使用示例及注意事項(xiàng)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
springboot2.0?@Slf4j?log?彩色日志配置輸出到文件
這篇文章主要介紹了springboot2.0 @Slf4j log日志配置輸出到文件(彩色日志),解決方式是使用了springboot原生自帶的一個log框架,結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-08-08
Idea中Java項(xiàng)目如何修改項(xiàng)目名
這篇文章主要介紹了Idea中Java項(xiàng)目如何修改項(xiàng)目名問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06

