1. 程式人生 > >使用UDP協議實現文字互動

使用UDP協議實現文字互動

  網路通訊協議有很多種,目前應用最廣泛的是TCP/IP協議(Transmission Control Protocal/Internet Protoal傳輸控制協議/英特網互聯協議),它是一個包括TCP協議和IP協議,UDP(User Datagram Protocol)協議和其它一些協議的協議組。

 

  UDP是無連線通訊協議,即在資料傳輸時,資料的傳送端和接收端不建立邏輯連線。在使用UDP協議傳送資料時,由於UDP的面向無連線性,不能保證資料的完整性,因此在傳輸重要資料時不建議使用UDP協議。

  TCP協議是面向連線的通訊協議,即在傳輸資料前先在傳送端和接收端建立邏輯連線,然後再傳輸資料,它提供了兩臺計算機之間可靠無差錯的資料傳輸。在TCP連線中必須要明確客戶端與伺服器端,由客戶端向服務端發出連線請求,每次連線的建立都需要經過“三次握手”。第一次握手,客戶端向伺服器端發出連線請求,等待伺服器確認,第二次握手,伺服器端向客戶端回送一個響應,通知客戶端收到了連線請求,第三次握手,客戶端再次向伺服器端傳送確認資訊,確認連線。由於TCP協議的面向連線特性,它可以保證傳輸資料的安全性,所以是一個被廣泛採用的協議,例如在下載檔案時,如果資料接收不完整,將會導致檔案資料丟失而不能被開啟,因此,下載檔案時必須採用TCP協議。

 

  前面介紹了UDP是一種面向無連線的協議,因此,在通訊時傳送端和接收端不用建立連線。

  UDP通訊需要用到兩個類——DatagramPacket類和DatagramSocket類。

 

 

  DatagramPacket類用於封裝UDP通訊中傳送或者接收的資料。

  DatagramPacket類會用到下面兩個方法

  DatagramPacket類——使用這個類的例項物件就可以傳送和接收DatagramPacket資料包。

這個類用到下面的方法。

UDP協議就介紹到這,下面演示文字互動程式碼(由於只有一臺電腦所以用的是本機地址)

傳送端

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();
	}

}

  因為無論傳送還是接收都不可能只進行一次,所以會有死迴圈。

 

 

 

 

 

 

 

 

 

 

&n