基於UDP協議的通信是不安全的,因為輸出的包沒有標記,接收方無法判別文件是否丟失

UDP協議兩個最重要的關鍵字為:

datagramsocket和datagrampacket

datagrampacket是用來打包數據的,將接收方的IP地址和接口都寫進包內

datagramsocket只負責寄出這個包裹,它自己會傳輸到指定端口

接收方可通過傳送過來的包裹獲取其中的socketAddress

並通過這個地址信息返回信息給寄出方

代碼示例:

* 客户端
 * @author 金前旺
 *
 */
public class Datagramclient {
public static void main(String[] args) {
	InetAddress ia = null;
	DatagramPacket packet = null;
	DatagramSocket socket = null;
	DatagramPacket dp = null;
	
	String str  ="姓名:金前旺   密碼:123";
	byte[] b =  str.getBytes();
	try {
		//通過InetAddress.getByName()可以獲取輸入括號內地址的ip參數
		ia = InetAddress.getByName("localhost");
		//將數據打包,參數:數組,數組長度,對方IP,端口
		packet = new DatagramPacket(b, b.length, ia, 5000);
		//通過new DatagramSocket()可以獲取寄出郵件的對象
		socket = new DatagramSocket();
		//將郵件寄出
		socket.send(packet);
		
		//然後接受對方返回的信息
		byte[] by = new byte[1024];
		//準備一個接受的數組,並將其打包成DatagramPacket對象
		dp = new DatagramPacket(by, by.length);
		//然後調用socket接受郵包
		socket.receive(dp);
		//然後拆包
		String st = new String(dp.getData(), 0, dp.getData().length);
		System.out.println("主機説"+st);
	} catch (UnknownHostException e) {
		e.printStackTrace();
	} catch (SocketException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}finally{
		socket.close();	}
* 主機端
 * @author 金前旺
 *
 */
public class DatagramServer {
public static void main(String[] args) {
	DatagramSocket socket = null;
	
	//首先準備一個數組
	byte[] b = new byte[1024];
	//將數組打包
	DatagramPacket packet = new DatagramPacket(b, b.length);
	//然後獲取DatagramSocket對象,用來發出和接受郵包
	try {
		socket = new DatagramSocket(5000);
		//然後接受寄來的郵包
		socket.receive(packet);
		//拆包
		String str = new String(packet.getData(), 0, packet.getData().length);
		System.out.println("客户説:"+str);
		
		//然後給個回覆
		String s= "驗證無誤,允許登陸!";
		byte[] by = s.getBytes();
		//獲得對方的IP地址和接口信息
		SocketAddress sa = packet.getSocketAddress();
		//有了IP和接口地址我們就可以寄出郵包了
		DatagramPacket dp = new DatagramPacket(by, by.length, sa);
		//然後通過socket將這個郵包寄出去
		socket.send(dp);
		
	} catch (SocketException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally{
		if (socket!=null) {
			socket.close();
		}