Java網路程式設計4.UDP網路程式設計之多執行緒優化
阿新 • • 發佈:2018-12-11
UDP網路程式設計之多執行緒優化——DatagramSocket類
1、UDP網路程式設計之多執行緒優化的思想
(1)一個執行緒實現客戶端——傳送資料
(2)一個執行緒實現伺服器端——接收資料
(3)在控制檯顯示解析出來的資料
2、UDP網路程式設計之多執行緒優化
(1)傳送資料端的執行緒——客戶端執行緒
package cn.itcast_05; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendThread implements Runnable { private DatagramSocket ds; public SendThread(DatagramSocket ds) { this.ds = ds; } @Override public void run() { try { // 封裝鍵盤錄入資料 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = br.readLine()) != null) { if ("886".equals(line)) { break; } // 建立資料並打包 byte[] bys = line.getBytes(); DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("192.168.12.255"), 12306); // 傳送資料 ds.send(dp); } // 釋放資源 ds.close(); } catch (IOException e) { e.printStackTrace(); } } }
(2)接收資料端的執行緒——伺服器端執行緒
package cn.itcast_05; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class ReceiveThread implements Runnable { private DatagramSocket ds; public ReceiveThread(DatagramSocket ds) { this.ds = ds; } @Override public void run() { try { while (true) { // 建立一個包裹 byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys,bys.length); // 接收資料 ds.receive(dp); // 解析資料 String ip = dp.getAddress().getHostAddress(); String s = new String(dp.getData(),0,dp.getLength()); System.out.println("from " + ip + " data is : " + s); } } catch (IOException e) { e.printStackTrace(); } } }
(3)通過多執行緒改進剛才的聊天程式,這樣我們就可以實現在一個視窗傳送和接收資料了
package cn.itcast_05; import java.io.IOException; import java.net.DatagramSocket; /* * 通過多執行緒改進剛才的聊天程式,這樣我就可以實現在一個視窗傳送和接收資料了 */ public class ChatRoom { public static void main(String[] args) throws IOException { DatagramSocket dsSend = new DatagramSocket(); DatagramSocket dsReceive = new DatagramSocket(12306); SendThread st = new SendThread(dsSend); ReceiveThread rt = new ReceiveThread(dsReceive); Thread t1 = new Thread(st); Thread t2 = new Thread(rt); t1.start(); t2.start(); } }