Java實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)通信UDP編程
UDP編程通信
基本介紹
- 類DatagramSocket和DatagramPacket【數(shù)據(jù)包/數(shù)據(jù)報(bào)】實(shí)現(xiàn)了基于UDP協(xié)議網(wǎng)絡(luò)程序。
- UDP數(shù)據(jù)報(bào)通過數(shù)據(jù)報(bào)套接字DatagramSocket發(fā)送和接收,系統(tǒng)不保證UDP數(shù)據(jù)報(bào)一定能安全送到目的地,也不確信什么時(shí)候可以抵達(dá)。
- DatagramPacket對(duì)象封裝了UDP數(shù)據(jù)報(bào),在數(shù)據(jù)報(bào)中包含了發(fā)送端的IP地址和端口號(hào)以及接收端的IP地址和端口號(hào)。
- UDP協(xié)議中每個(gè)數(shù)據(jù)報(bào)都給出了完整的地址信息,因此無須建立發(fā)送方和接收方的連接。
基本流程
- 核心的兩個(gè)類/對(duì)象DatagramSocket域DatagramPacket
- 建立發(fā)送端,接收端。
- 建立數(shù)據(jù)包
- 調(diào)用DatagramSocket的發(fā)送、接收方法
- 關(guān)閉DatagramSocket。
UDP網(wǎng)絡(luò)編程原理示意圖

UDP說明:
- 沒有明確的服務(wù)端和客戶端,演變成數(shù)據(jù)的發(fā)送端和接收端。
- 接收數(shù)據(jù)和發(fā)生數(shù)據(jù)是通過DatagramSocket對(duì)象完成。
- 將數(shù)據(jù)封裝到DatagramPacket對(duì)象/裝包。
- 當(dāng)接收到DatagramPacket對(duì)象,需要進(jìn)行拆包,取出數(shù)據(jù)
- DatagramSocket可以指定在哪個(gè)端口接收數(shù)據(jù)。
package com.study.srv.demo18;
import java.io.IOException;
import java.net.*;
/**
* @version 1.0
* UDP發(fā)送端
*/
public class Demo11 {
public static void main(String[] args) throws IOException {
//1.創(chuàng)建DatagramSocket對(duì)象,準(zhǔn)備發(fā)送和接收數(shù)據(jù),在9998端口接收
DatagramSocket datagramSocket = new DatagramSocket(9998);
//2.將需要發(fā)送的數(shù)據(jù),封裝到DatagramPacket對(duì)象
String s="發(fā)送的數(shù)據(jù)";
byte[] buf=s.getBytes();
InetAddress ip = InetAddress.getByName("192.168.0.18");
//說明:封裝的DatagramPacket對(duì)象
//buf 內(nèi)容字節(jié)數(shù)組
//buf.length 數(shù)據(jù)長(zhǎng)度
//ip 主機(jī)(ip)
//9999 端口
DatagramPacket packet = new DatagramPacket(buf, buf.length, ip, 9999);
//發(fā)送數(shù)據(jù)
datagramSocket.send(packet);
//關(guān)閉資源
// datagramSocket.close();
System.out.println("發(fā)送完畢");
//發(fā)送端變?yōu)榻邮斩私邮諗?shù)據(jù)
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
int length = datagramPacket.getLength();
byte[] data = datagramPacket.getData();
String string = new String(data, 0, length);
System.out.println(string);
datagramSocket.close();
System.out.println("接受結(jié)束");
}
}
package com.study.srv.demo18;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* @version 1.0
*UDP接收端
*/
public class Demo10 {
public static void main(String[] args) throws IOException {
//1.創(chuàng)建一個(gè) DatagramSocket對(duì)象,準(zhǔn)備在9999接收數(shù)據(jù)
DatagramSocket datagramSocket = new DatagramSocket(9999);
//2.構(gòu)建一個(gè)DatagramPacket 對(duì)象,準(zhǔn)備接收數(shù)據(jù)
//在UDP協(xié)議,一個(gè)數(shù)據(jù)包最大64k
byte[] buf=new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
//3.接收方法 將通過網(wǎng)絡(luò)傳輸?shù)腄atagramPacket對(duì)象填充到packet里去。
System.out.println("接收端等待接收");
datagramSocket.receive(packet);
//4.可以對(duì)packet進(jìn)行拆包,取出數(shù)據(jù),并顯示
//實(shí)際接收到的數(shù)據(jù)字節(jié)長(zhǎng)度
int length = packet.getLength();
//實(shí)際接收到的數(shù)據(jù)
byte[] data = packet.getData();
String string = new String(data, 0, length);
System.out.println(string);
//5.關(guān)閉資源
// datagramSocket.close();
System.out.println("接收結(jié)束");
//接收端變?yōu)榘l(fā)送端,發(fā)送數(shù)據(jù)
String s="接收端變?yōu)榘l(fā)送端,發(fā)送數(shù)據(jù)";
byte[] bytes=s.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.0.18"), 9998);
datagramSocket.send(datagramPacket);
datagramSocket.close();
System.out.println("發(fā)送完畢");
}
}
到此這篇關(guān)于Java UDP編程的文章就介紹到這了,更多相關(guān)Java UDP編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java Socket實(shí)現(xiàn)UDP編程淺析
- Java網(wǎng)絡(luò)編程之UDP網(wǎng)絡(luò)通信詳解
- Java網(wǎng)絡(luò)編程之UDP實(shí)現(xiàn)原理解析
- Java網(wǎng)絡(luò)編程UDP協(xié)議發(fā)送接收數(shù)據(jù)
- Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)消息發(fā)送及聊天
- Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天
- Java編程使用UDP建立群聊系統(tǒng)代碼實(shí)例
- JAVA編程實(shí)現(xiàn)UDP網(wǎng)絡(luò)通訊的方法示例
相關(guān)文章
SpringBoot實(shí)現(xiàn)HTTP調(diào)用的7 種方式
本文主要介紹了SpringBoot實(shí)現(xiàn)HTTP調(diào)用的7 種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
關(guān)于使用MyBatis簡(jiǎn)化JDBC開發(fā)和解決SQL語句警告的問題
這篇文章主要介紹了關(guān)于使用MyBatis簡(jiǎn)化JDBC開發(fā)和解決SQL語句警告的問題,如果idea和數(shù)據(jù)庫沒有建立鏈接,idea不識(shí)別表的信息,就會(huì)出現(xiàn)SQL語句的警告,需要的朋友可以參考下2023-05-05
Maven中dependencyManagement管理項(xiàng)目依賴項(xiàng)
在開發(fā)?Java?項(xiàng)目時(shí),管理和協(xié)調(diào)依賴項(xiàng)的版本號(hào)是一項(xiàng)重要而繁瑣的任務(wù),本文主要介紹了Maven中dependencyManagement管理項(xiàng)目依賴項(xiàng),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
java實(shí)現(xiàn)的小時(shí)鐘示例分享
這篇文章主要介紹了java實(shí)現(xiàn)的小時(shí)鐘示例,需要的朋友可以參考下2014-02-02
Java 根據(jù)網(wǎng)絡(luò)URL獲取該網(wǎng)頁上面所有的img標(biāo)簽并下載圖片
這篇文章主要介紹了Java 根據(jù)網(wǎng)絡(luò)URL獲取該網(wǎng)頁上面所有的img標(biāo)簽并下載圖片,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11

