package com.dev.bybb; import java.io.IOException; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.util.Date; import java.util.Iterator; import java.util.Set; import main.page_debug_inf; import com.Com; import com.ComFn; public class UdpServBYBB implements Runnable { private boolean running_en = true; private page_debug_inf dt_debug_inf; public UdpServBYBB(page_debug_inf db_inf) { dt_debug_inf = db_inf; } public void exitThread() { running_en = false; } @Override public void run() { while(true == running_en) { runDdpServ(dt_debug_inf); try { Thread.sleep(500); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } dt_debug_inf.addDebugInf(Com.get_DTF(new Date(), Com.DTF_YMDhms_S) + " UDP Serv Thread Exit!\n"); } private void runDdpServ(page_debug_inf out_inf) { DatagramSocket socket = null; DatagramChannel channel = null; Selector selector = null; try { //´´½¨channel channel = DatagramChannel.open(); //Ö¸¶¨Îª·Ç×èÈû·½Ê½ channel.configureBlocking(false); socket = channel.socket(); //°ó¶¨ipºÍ¶Ë¿Ú int udp_serv_port = 6600; InetSocketAddress address = new InetSocketAddress(udp_serv_port); socket.bind(address); dt_debug_inf.addDebugInf("port: " + udp_serv_port + "\n"); //´´½¨¼àÌýÆ÷ selector = Selector.open(); //×¢²á¶Áʼþ channel.register(selector, SelectionKey.OP_READ); //¶Á»º³å ByteBuffer readBuffer = ByteBuffer.allocate(1024); while (true == running_en) { //µÈʼþ³öÏÖ if (selector.select(100) < 1) { Thread.sleep(10); continue; } //»ñÈ¡·¢ÉúµÄʼþ Set keys = selector.selectedKeys(); Iterator it = keys.iterator(); while (it.hasNext()) { //»ñȡʼþ£¬ÒƳýÕýÔÚ´¦ÀíµÄʼþ SelectionKey key = it.next(); it.remove(); //¶ÁÈ¡ÏûÏ¢ if(key.isReadable()){ DatagramChannel datagramChannel = (DatagramChannel) key.channel(); readBuffer.clear(); datagramChannel.receive(readBuffer); readBuffer.flip(); byte[] dat_rx = new byte[readBuffer.limit()]; readBuffer.get(dat_rx); if(dat_rx.length > 0) { out_inf.addDebugInf(Com.get_DTF(new Date(), Com.DTF_YMDhms_S) + " UDP RX: " + ComFn.bytesToHexString(dat_rx, dat_rx.length) + "\n"); } } } } selector.close(); socket.close(); channel.close(); } catch (IOException | InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if(null != selector) { selector.close(); } if(null != channel) { channel.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(null != socket) { socket.close(); } } } }