應用情境: 一個學校,每當下課時間到了提供提示下課功能。
分析:用UDP實現廣播向同網段電腦發送資料,用戶端接受接受到資料後,彈出提示對話方塊。服務端需要一個迴圈來判斷時間是否到下課時間,這裡如果用死迴圈,很占系統資源,我測試CUP在100%,用java的Timer類可以很好的解決這個問題,既能保證程式始終運行,又不怎麼占系統資源,具體什麼原理,沒有仔細研究過。下面來看代碼具體實現
服務段代碼:
import java.io.IOException;<br />import java.net.DatagramPacket;<br />import java.net.DatagramSocket;<br />import java.net.InetAddress;<br />import java.net.SocketException;<br />import java.net.UnknownHostException;<br />import java.text.SimpleDateFormat;<br />import java.util.Date;<br />import java.util.Timer;<br />public class UdpSend {<br /> public void sendData()throws SocketException,<br />UnknownHostException{<br /> DatagramSocket ds = new DatagramSocket();// 建立用來發送資料報包的通訊端<br />String str = "1";<br />DatagramPacket dp = new DatagramPacket(str.getBytes(),<br />str.getBytes().length,<br />InetAddress.getByName("255.255.255.255"), 3001);<br />// 構造資料報包,用來將長度為 length 的包發送到指定主機上的指定連接埠號碼<br />try {<br />ds.send(dp);<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />ds.close();</p><p> }<br />public static void main(String[] args) {<br /> Timer timer = new Timer();<br /> timer.schedule(new MyTask(), 1000, 1000);<br />}<br /> static class MyTask extends java.util.TimerTask{<br /> @Override<br /> public void run() {<br /> UdpSend tt = new UdpSend();<br /> Date d = new Date();<br /> SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");<br /> String strdate = sdf.format(d);<br /> String[] classTime = {"17:18:00","17:19:00","17:20:00"};<br />for(int i = 0;i<classTime.length;i++){<br /> if(classTime[i].equals(strdate)){<br /> try {<br />tt.sendData();<br />} catch (SocketException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />} catch (UnknownHostException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />}<br /> }<br />}<br /> }<br /> }<br />}<br />
客戶單簡單程式碼範例,沒有做迴圈
package udp;<br />import java.net.DatagramPacket;<br />import java.net.DatagramSocket;<br />public class UdpRecv {<br />public static void main(String[] args) throws Exception {<br />DatagramSocket ds = new DatagramSocket(3001);// 建立接收資料通訊端並將其綁定到本地主機上的指定連接埠<br />byte[] buf = new byte[1024];<br />DatagramPacket dp = new DatagramPacket(buf, 1024);<br />ds.receive(dp);<br />String strRecv = new String(dp.getData(), 0, dp.getLength()) + " from "<br />+ dp.getAddress().getHostAddress() + ":" + dp.getPort();<br />System.out.println(strRecv);<br />ds.close();<br />}<br />}<br />