使用UDP協議實現文字交互

  網絡通訊協議有不少種,目前應用最普遍的是TCP/IP協議(Transmission Control Protocal/Internet Protoal傳輸控制協議/英特網互聯協議),它是一個包括TCP協議和IP協議,UDPUser Datagram Protocol)協議和其它一些協議的協議組java

 

  UDP是無鏈接通訊協議,即在數據傳輸時,數據的發送端和接收端不創建邏輯鏈接。在使用UDP協議傳送數據時,因爲UDP的面向無鏈接性,不能保證數據的完整性,所以在傳輸重要數據時不建議使用UDP協議。數組

  TCP協議是面向鏈接的通訊協議,即在傳輸數據前先在發送端和接收端創建邏輯鏈接,而後再傳輸數據,它提供了兩臺計算機之間可靠無差錯的數據傳輸。在TCP鏈接中必需要明確客戶端與服務器端,由客戶端向服務端發出鏈接請求,每次鏈接的建立都須要通過「三次握手」。第一次握手,客戶端向服務器端發出鏈接請求,等待服務器確認,第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了鏈接請求,第三次握手,客戶端再次向服務器端發送確認信息,確認鏈接。因爲TCP協議的面向鏈接特性,它能夠保證傳輸數據的安全性,因此是一個被普遍採用的協議,例如在下載文件時,若是數據接收不完整,將會致使文件數據丟失而不能被打開,所以,下載文件時必須採用TCP協議。安全

 

  前面介紹了UDP是一種面向無鏈接的協議,所以,在通訊時發送端和接收端不用創建鏈接。服務器

  UDP通訊須要用到兩個類——DatagramPacket類和DatagramSocket類。網絡

 

 

  DatagramPacket用於封裝UDP通訊中發送或者接收的數據。spa

  DatagramPacket類會用到下面兩個方法.net

  DatagramPacket類——使用這個類的實例對象就能夠發送和接收DatagramPacket數據包。對象

這個類用到下面的方法。blog

UDP協議就介紹到這,下面演示文字交互代碼(因爲只有一臺電腦因此用的是本機地址)ip

發送端

package com.lty.wangluojianpanluru;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/*
 *實現UDP協議的發送端
 * 		實現封裝數據的類java.net.DatagramPacket 將數據包裝
 * 		實現數據傳輸的類java.net.DataGramPacket	將數據包發出去
 * 
 * 實現步驟:
 * 	1.建立DatagramPacket對象,封裝數據,接收的地址和端口
 * 	2.建立DatagramSocket
 *  3.調用DatagramSocket類方法send,發送數據包
 *  4.關閉資源
 *  
 *  DatagramPacket構造方法
 *  	DatagramPacket(byte[] buf, int length, InetAddress address, int port)
 *  
 *  DatagramSocket構造方法:
 *  	DatagramSocket()空參數
 *  	方法: send(DatagramPacket d)
 * 文字交互案例思想
 *  實現UDP發送,鍵盤輸入的形式
 * 		輸入完畢發給接收端
 */
public class UDPsend {
	public static void main(String[] args) throws IOException{
		Scanner sc=new Scanner(System.in);
		//建立DatagramSocket對象,數據包的發送和接收對象
		DatagramSocket ds =new DatagramSocket();
		//建立InetAddress對象,封裝本身的IP地址
		InetAddress inet=InetAddress.getByName("127.0.0.1");
		
		while(true) {
		String message=sc.nextLine();
		//建立數據包對象,封裝要發送的數據,接收端IP,端口
		byte[] date=message.getBytes();
		DatagramPacket dp=new DatagramPacket(date,date.length,inet,5000);
		//調用ds對象的方法send,發送數據包
		ds.send(dp);
		}
//		ds.close();
	}
}

  接收端

package com.lty.wangluojianpanluru;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 * 實現UDP協議的接收端
 * 		實現封裝數據的類java.net.DatagramPacket  將數據包接收
 * 		實現數據輸出的類java.net.DataGramPacket  接收數據包
 * 
 * 實現步驟:
 * 	1.建立DatagramSocket對象,綁定端口號
 * 		要和發送端端口號一致
 * 	2.建立字節數組,接收發來的數據
 *  3.建立數據包對象DatagramPacket
 *  4.調用DatagramSocket對象方法
 *  	received(DatagramPacket dp)接收數據,數據放在數據包中
 *  5.拆包
 *  	發送的IP地址
 *  		數據包對象DatagramPacket方法getAddress()獲取的是發送端的IP地址對象
 *  返回值是InetAddress對象
 *  	接收到的字節個數
 *  		數據包對象DatagramPacket方法getLength()
 *  	發送方的端口號
 *  6.關閉資源
 * 
 *文字交互案例思想
 *  實現UDP協議的接收端
 *  永不停歇的接收端
 *  
 */
public class UDPReceive {

	public static void main(String[] args) throws IOException{
		// 建立數據包傳輸對象DatagramSocket 綁定端口號
		DatagramSocket ds=new DatagramSocket(5000);
		//建立字節數組
		byte[] data = new byte[1024];
		//建立數據包對象,傳遞字節數組
		
		while(true) {
		DatagramPacket dp=new DatagramPacket(data,data.length);
		//調用ds對象的方法receive傳遞數據包
		ds.receive(dp);
		
		//獲取發送端的IP地址對象
		String ip=dp.getAddress().getHostAddress();
		
		//獲取接收到的字節個數
		int length = dp.getLength();
		System.out.println(new String(data,0,length)+"....."+ip);
		}
//		ds.close();
	}

}

  由於不管發送仍是接收都不可能只進行一次,因此會有死循環。

相關文章
相關標籤/搜索