Java網(wǎng)絡(luò)編程之UDP網(wǎng)絡(luò)通信詳解
1.UDP網(wǎng)絡(luò)通信編程原理
1.1 UDP網(wǎng)絡(luò)通信編程介紹
類 DatagramSocket 何 DatagramPacket(數(shù)據(jù)包/數(shù)據(jù)報) 實現(xiàn)了基于 UDP協(xié)議網(wǎng)絡(luò)程序;
UDP數(shù)據(jù)報通過數(shù)據(jù)報套接字 DatagramSocket 發(fā)送和接收,系統(tǒng)不保證 UDP數(shù)據(jù)報一定能夠安全送達目的地,也不確定什么時候可以抵達;
DatagramPacket 對象封裝了 UDP數(shù)據(jù)報,在數(shù)據(jù)報中包含了發(fā)送端IP地址和端口號,以及接收端的IP地址和端口號;
UDP協(xié)議中每個數(shù)據(jù)報都給出了完整的地址信息,因此無法建立發(fā)送方與接收方的連接。
沒有明確的服務(wù)端和客戶端,演變成數(shù)據(jù)的發(fā)送端和接收端;
接收數(shù)據(jù)和發(fā)送數(shù)據(jù)都是通過 DatagramSocket 對象完成。
1.2 UDP網(wǎng)絡(luò)通信編程的基本流程
核心的兩個類/對象,DatagramSocket與DatagramPacket;
建立發(fā)送端和接收端;
建立數(shù)據(jù)包;
調(diào)用DatagramSocket的發(fā)送和接收方法;
關(guān)閉DatagramSocket。
2.UDP網(wǎng)絡(luò)通信編程案例
1.編寫一個接收端A,一個發(fā)送端B;
2.接收端在 9999端口等待接收數(shù)據(jù)(receive);
3.發(fā)送端向接收端發(fā)送數(shù)據(jù):“你好!接收端”;
4.接收端接收到發(fā)送端的數(shù)據(jù)后,回復(fù):“你好!發(fā)送端”,再退出;
5.發(fā)送端接收回復(fù)的數(shù)據(jù),退出。
UDPReceiverA
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @author 興趣使然黃小黃
* @version 1.0
* 接收端A
*/
public class UDPReceiverA {
public static void main(String[] args) throws IOException {
//1.創(chuàng)建一個DatagramSocket對象,準(zhǔn)備在9999接收數(shù)據(jù)
DatagramSocket socket = new DatagramSocket(9999);
//2.構(gòu)建一個DatagramPacket對象,準(zhǔn)備接收數(shù)據(jù)
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
//3.調(diào)用接收方法,將通過網(wǎng)絡(luò)傳輸?shù)?DatagramPacket對象 填充到 packet對象
System.out.println("接收端A 等待接收數(shù)據(jù)...");
socket.receive(packet);
//4.把packet進行拆包,取出數(shù)據(jù)
int length = packet.getLength();//實際數(shù)據(jù)字節(jié)長度
byte[] data = packet.getData();//實際接收的數(shù)據(jù)
String s = new String(data, 0, length);
System.out.println(s);
//回復(fù)信息給B端
data = "你好!發(fā)送端".getBytes();
packet = new DatagramPacket(data, 0, data.length,
InetAddress.getLocalHost(), 9998);
socket.send(packet);
//5.關(guān)閉資源
socket.close();
}
}
UDPSenderB
import java.io.IOException;
import java.net.*;
/**
* @author 興趣使然黃小黃
* @version 1.0
* 發(fā)送端B
*/
public class UDPSenderB {
public static void main(String[] args) throws IOException {
//1.創(chuàng)建 DatagramSocket 對象,準(zhǔn)備在9998發(fā)送和接收數(shù)據(jù)
DatagramSocket socket = new DatagramSocket(9998);
//2.將需要發(fā)送的數(shù)據(jù),封裝到 DatagramPacket 中
byte[] data = "你好!接收端".getBytes();
DatagramPacket datagramPacket =
new DatagramPacket(data, 0, data.length,
InetAddress.getLocalHost(), 9999);
socket.send(datagramPacket);
//接收A消息
socket.receive(datagramPacket);
int length = datagramPacket.getLength();//實際數(shù)據(jù)字節(jié)長度
data = datagramPacket.getData();//實際接收的數(shù)據(jù)
String s = new String(data, 0, length);
System.out.println(s);
//關(guān)閉資源
socket.close();
}
}


到此這篇關(guān)于Java網(wǎng)絡(luò)編程之UDP網(wǎng)絡(luò)通信詳解的文章就介紹到這了,更多相關(guān)Java UDP網(wǎng)絡(luò)通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中@EnableAsync和@Async注解的使用小結(jié)
在SpringBoot中,可以通過@EnableAsync注解來啟動異步方法調(diào)用的支持,通過@Async注解來標(biāo)識異步方法,讓方法能夠在異步線程中執(zhí)行,本文就來介紹一下,感興趣的可以了解一下2023-11-11
配置hadoop環(huán)境mapreduce連接不上hdfs解決
這篇文章主要為大家介紹了配置hadoop環(huán)境mapreduce連接不上hdfs解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
Spring Security結(jié)合JWT的方法教程
這篇文章主要給大家介紹了關(guān)于Spring Security結(jié)合JWT的方法教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
springboot tomcat的maxHttpFormPostSize參數(shù)示例解析
這篇文章主要介紹了springboot tomcat的maxHttpFormPostSize參數(shù)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08

