天天看點

00023.12 UDP協定程式設計(非面向連接配接、隻有發送端和接收端、沒有用戶端和服務端)系列文章目錄前言一、UDP二、完整代碼總結

系列文章目錄

文章目錄

  • 系列文章目錄
  • 前言
  • 一、UDP
  • 二、完整代碼
    • `發送端`
    • `接收端`
  • 總結

前言

UDP:非面向連接配接的,不可靠的,基于資料報的傳輸協定

沒有服務端和用戶端之說

一、UDP

1、

UDP:非面向連接配接的,不可靠的,基于資料報的傳輸協定

2、

Socket用的是這兩個,沒有服務端和用戶端之說,隻有發送端和接收端,兩邊是平等的關系,但是實際開發當中

都是伺服器端給用戶端推送資訊居多,但是并沒有規定說一定是給服務端用的,大多時候實際應用中是伺服器給用戶端推送消息需要用到

(這裡的用戶端服務端不是嚴格意義上的)

DatagramSocket

DatagramPacket

3、

發送端

接收端

  • 實際中,一般是伺服器用戶端推送消息。
  • 當用戶端連接配接伺服器,伺服器就擷取的用戶端IP位址和端口号,伺服器就給用戶端推送廣告消息
  • 4、
  • 發送端:
00023.12 UDP協定程式設計(非面向連接配接、隻有發送端和接收端、沒有用戶端和服務端)系列文章目錄前言一、UDP二、完整代碼總結
  • DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
  • 參數一:要發送的資料的位元組數組
  • 參數二:從位元組數組的哪個下标開始
  • 參數三:發送幾個位元組
  • 參數四:接收方的IP
  • 參數五:接收方的端口号
    00023.12 UDP協定程式設計(非面向連接配接、隻有發送端和接收端、沒有用戶端和服務端)系列文章目錄前言一、UDP二、完整代碼總結
    00023.12 UDP協定程式設計(非面向連接配接、隻有發送端和接收端、沒有用戶端和服務端)系列文章目錄前言一、UDP二、完整代碼總結

5、

  • 接收方:

    *同樣也是用DatagramSocket

  • DatagramPacket(byte[] buf, int length) 
               
  • 參數一:用來裝資料的位元組數組
  • 參數二:數組的長度
00023.12 UDP協定程式設計(非面向連接配接、隻有發送端和接收端、沒有用戶端和服務端)系列文章目錄前言一、UDP二、完整代碼總結

運作看效果

我們還能像TCP那樣先運作服務端嗎?

不能,如果想較好的看到效果,應該想把接收方運作起來,接收方會去等待發送方

00023.12 UDP協定程式設計(非面向連接配接、隻有發送端和接收端、沒有用戶端和服務端)系列文章目錄前言一、UDP二、完整代碼總結

二、完整代碼

發送端

package com.atguigu.test17;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/*
 * 發送端:
 * DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 
 * 參數一:要發送的資料的位元組數組
 * 參數二:從位元組數組的哪個下标開始
 * 參數三:發送幾個位元組
 * 參數四:接收方的IP
 * 參數五:接收方的端口号
 */
public class TestSend {
	public static void main(String[] args) throws IOException {
		//1、發送方,建立一個Socket
		//發送方的端口号和IP位址,自動擷取
		DatagramSocket ds = new DatagramSocket();
		
		//2、準備把要發送的資料打包
		String str = "馬上下課了";
		byte[] bytes = str.getBytes();
		InetAddress ip = InetAddress.getByName("192.168.30.142");
		DatagramPacket dp = new DatagramPacket(bytes,0,bytes.length, ip, 9999);
		
		//3、發送,通過socket發送
		ds.send(dp);
		System.out.println("發送完畢");
		
		//4、關閉
		ds.close();
		
	}
}

           

接收端

package com.atguigu.test17;

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

/*
 * 接收方:
 * 	DatagramPacket(byte[] buf, int length) 
 * 	參數一:用來裝資料的位元組數組
 *  參數二:數組的長度
 */
public class TestReceive {
	public static void main(String[] args) throws IOException {
		//1、接收方也要socket
		//接收方的端口号,指定,IP自動擷取
		DatagramSocket ds = new DatagramSocket(9999);
		
		//2、準備一個資料報,接收資料
		byte[] data = new byte[1024];
		DatagramPacket dp = new DatagramPacket(data,data.length);
		
		//3、接收資料
		ds.receive(dp);
		
		//4、把資料拆解出來
		byte[] bs = dp.getData();//接收的資料
		int len = dp.getLength();//接收的資料的實際長度
		System.out.println(new String(bs,0,len));
		
		//5、斷開
		ds.close();
	}
}

           

總結

1、UDP沒有服務端和用戶端之說,隻有發送端和接收端

2、用的Socket是這兩個:DatagramSocket、DatagramPacket