網路程式設計(中)

世界美景發表於2017-11-03

上一篇文章 網路程式設計(上)我們瞭解了 網路程式設計之三要素 和Socket  通訊原理 此篇文章我們將學習 UDP傳輸與最佳化 

沒看過的朋友最好看下 網路程式設計(上) 加深理解 畢竟基礎知識回憶一下也是好的 在看此文也能更加透徹的理解

網路程式設計  (UDP傳輸)

 1.傳送Send
* 建立DatagramSocket, 隨機埠號
* 建立DatagramPacket, 指定資料, 長度, 地址, 埠
* 使用DatagramSocket傳送DatagramPacket
* 關閉DatagramSocket

eclipse 寫兩個main方法  我用的 Aandroid Studio 

/**
	 * * 1.傳送Send
	 * 建立DatagramSocket, 隨機埠號
	 * 建立DatagramPacket, 指定資料, 長度, 地址, 埠
	 * 使用DatagramSocket傳送DatagramPacket
	 * 關閉DatagramSocket
	 */
	public static void main(String[] args) throws Exception {
		String str = "你好世界";
		DatagramSocket socket = new DatagramSocket();	//建立Socket相當於建立碼頭
		DatagramPacket packet = 	//建立Packet相當於集裝箱(資料)								
	new DatagramPacket(str.getBytes(), str.getBytes().length, 
        InetAddress.getByName("127.0.0.1"), 9999);
		socket.send(packet);	//發貨,將資料發出去									
		socket.close();		//關閉碼頭 底層實現IO流 所以必須要關閉
	}

2.接收Receive
* 建立DatagramSocket, 指定埠號
* 建立DatagramPacket, 指定陣列, 長度
* 使用DatagramSocket接收DatagramPacket
* 關閉DatagramSocket
* 從DatagramPacket中獲取資料
* 3.接收方獲取ip和埠號
* String ip = packet.getAddress().getHostAddress();
* int port = packet.getPort();

/**
	 ** 2.接收 
	 * 建立DatagramSocket, 指定埠號
	 * 建立DatagramPacket, 指定陣列, 長度
	 * 使用DatagramSocket接收DatagramPacket
	 * 關閉DatagramSocket
	 * 從DatagramPacket中獲取資料
	 */
	public static void main(String[] args) throws Exception {
		DatagramSocket socket = new DatagramSocket(9999);	//建立Socket相當於建立碼頭 指定埠號9999
		DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//建立Packet相當於建立集裝箱
		socket.receive(packet);			//接貨,接收資料
		
		byte[] arr = packet.getData();		//獲取全部的資料  有些為空
		int len = packet.getLength();		//獲取有效的位元組個數
		System.out.println(new String(arr,0,len));  // 列印 接收到的資料
		socket.close();  // 關流
	}



注意啟動的時候要 先啟動服務端 在啟動傳送端


網路程式設計(UDP 傳輸最佳化)

上面的程式碼看起有點簡陋 要一句一句傳送 我們來做個最佳化 以鍵盤錄入的形式


傳送端

/**
	 * * 1.傳送Send
	 * 建立DatagramSocket, 隨機埠號
	 * 建立DatagramPacket, 指定資料, 長度, 地址, 埠
	 * 使用DatagramSocket傳送DatagramPacket
	 * 關閉DatagramSocket
	 */
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);		//建立鍵盤錄入物件
		DatagramSocket socket = new DatagramSocket();	//建立Socket相當於建立碼頭
		
		while(true) {
			String line = sc.nextLine();	//獲取鍵盤錄入的字串
			if("quit".equals(line)) {
				break;
			}
			DatagramPacket packet = 		//建立Packet相當於集裝箱
	new DatagramPacket(line.getBytes(), line.getBytes().length,
             InetAddress.getByName("127.0.0.1"), 9999);
			socket.send(packet);   //發貨,將資料(資料)發出去
		}
		socket.close();												//關閉碼頭
	}

接收端


接收端
/**
	 ** 2.接收Receive
	 * 建立DatagramSocket, 指定埠號
	 * 建立DatagramPacket, 指定陣列, 長度
	 * 使用DatagramSocket接收DatagramPacket
	 * 關閉DatagramSocket
	 * 從DatagramPacket中獲取資料
	 */
	public static void main(String[] args) throws Exception {
		DatagramSocket socket = new DatagramSocket(9999);		//建立Socket相當於建立碼頭
		DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//建立Packet相當於建立集裝箱
		
		while(true) {
			socket.receive(packet);			//接貨,接收資料
			
			byte[] arr = packet.getData();	//獲取資料
			int len = packet.getLength();	//獲取有效的位元組個數
			String ip = packet.getAddress().getHostAddress();//獲取ip地址
			int port = packet.getPort();	//獲取埠號
	System.out.println(ip + ":" + port + ":" + new String(arr,0,len)); //為了看起來明顯點 加上ip地址和埠號
		}
	}


傳送資訊



接收到的資料




看起來是不是還不錯  可以一直做傳送操作 但必須開兩個視窗 很麻煩 我們接著使用多執行緒來做最佳化



網路程式設計(UDP傳輸 多執行緒最佳化)


接受與傳送在同一個視窗完成

 /**
     * @param args
     */
    public static void main(String[] args) throws InterruptedException {
        new Receive().start();
        // 可以做個睡眠操作 如果你怕 傳送先開啟的話
        new Send().start();
    }

}

class Receive extends Thread {
    public void run() {
        try {
            DatagramSocket socket = new DatagramSocket(9999);	//建立Socket相當於建立碼頭
            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//建立Packet相當於建立集裝箱

            while(true) {
                socket.receive(packet);									//接貨,接收資料

                byte[] arr = packet.getData();		//獲取資料
                int len = packet.getLength();		//獲取有效的位元組個數
                String ip = packet.getAddress().getHostAddress();//獲取ip地址
                int port = packet.getPort();		//獲取埠號
                System.out.println(ip + ":" + port + ":" + new String(arr,0,len));
            }
        } catch (IOException e) {

            e.printStackTrace();
        }
    }
}

class Send extends Thread {
    public void run() {
        try {
            Scanner sc = new Scanner(System.in);		//建立鍵盤錄入物件
            DatagramSocket socket = new DatagramSocket();//建立Socket相當於建立碼頭

            while(true) {
                String line = sc.nextLine();		//獲取鍵盤錄入的字串
                if("quit".equals(line)) {
                    break;
                }
                DatagramPacket packet = 								//建立Packet相當於集裝箱
                        new DatagramPacket(line.getBytes(), line.getBytes().length, 
                    InetAddress.getByName("127.0.0.1"), 9999);
                socket.send(packet);									//發貨,將資料發出去
            }
            socket.close();
        }  catch (IOException e) {

            e.printStackTrace();
        }
    }

這下不是美滋滋 就在一個視窗完成了所有操作



這就是UDP 的核心邏輯了 其實還可以寫GUI(影像化介面)加上 聊天記錄 清屏 震動等功能 但一點用也沒有 沒有價值  學習到了核心邏輯就行了  過幾天我會寫 TCP協議 其實這些都是為了 即時通訊做鋪墊  如果此文幫助到了你希望能給點個贊










   

相關文章