14.Java实现UDP通信
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                14.Java实现UDP通信
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                1.關鍵API
java.net包里提供了實現網絡應用程序的類。
 在Java中,我們可以使用DatagramSocket來創建UDP服務器,使用DatagramPacket來裝載接受的數據。
 DatagramSocket這個類是用來發送和接收數據包的套接字類。
DatagramPacket這個類是用來存儲數據的數據包。
 一般的用法如下:
1.1 UDP報文格式
首先要知道UDP是一種無連接的傳輸層協議。與TCP不同的是,UDP不保證數據完整無誤的發送給目標,而是通過IP層的最大努力機制來傳遞數據的。
每個UDP報文分別由UDP報文頭和UDP數據區兩部分組成。
 其中UDP報文頭有8個字節:
 源端口(2字節)+目的端口(2字節)+報文長度(2字節)+校驗值(2字節)
 UDP數據區長度可變,根據報文長度不同而不同。
 
2.實例Demo
2.1 UDPServer
package InternetCode.Udp;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;/** 服務器端,實現基于UDP的用戶登陸*/ public class UDPServer {//公共類public static void main(String[] args) throws IOException {//主程序入口/** 接收客戶端發送的數據*/// 1.創建服務器端DatagramSocket,指定端口DatagramSocket socket = new DatagramSocket(8800);// 2.創建數據報,用于接收客戶端發送的數據byte[] data = new byte[1024];//創建字節數組,指定接收的數據包的大小DatagramPacket packet = new DatagramPacket(data, data.length);// 3.接收客戶端發送的數據System.out.println("****服務器端已經啟動,等待客戶端發送數據");//輸出提示信息//通過循環不停的向客戶接收數據new Thread(()->{while(true) {try {socket.receive(packet);// 此方法在接收到數據報之前會一直阻塞} catch (IOException e) {e.printStackTrace();}// 4.讀取數據String info = new String(data, 0, packet.getLength());//創建字符串對象System.out.println("我是服務器,客戶端說:" + info);//輸出提示信息}}).start();final InetAddress[] address = {null};final int[] port = {0};final boolean[] flag = {false};//向客戶端發送信息new Thread(()->{while (true){if(!flag[0]){// 1.定義客戶端的地址、端口號、數據address[0] = packet.getAddress();//獲取發送端的地址port[0] = packet.getPort();//獲取 發送端進程所綁定的端口flag[0] = true;}Scanner scanner = new Scanner(System.in);//從鍵盤接受數據String send = scanner.nextLine();//nextLine方式接受字符串byte[] data2 = send.getBytes();//將接收到的數據轉換為字節數組DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address[0], port[0]);// 2.創建數據報,包含響應的數據信息try {socket.send(packet2); // 3.響應客戶端} catch (IOException e) {e.printStackTrace();}}}).start();} }2.2 UDPClient
package InternetCode.Udp;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; /** 客戶端*/ public class UDPClient {//公共類public static void main(String[] args) throws IOException {//主程序入口/** 向服務器端發送數據*/// 1.定義服務器的地址、端口號、數據InetAddress address = InetAddress.getByName("localhost");int port = 8800;//定義端口類型DatagramSocket socket = new DatagramSocket();new Thread(()->{while(true) {//通過循環不同的向客戶端發送和接受數據Scanner scanner = new Scanner(System.in);//從鍵盤接受數據String send = scanner.nextLine();//nextLine方式接受字符串byte[] data = send.getBytes();//將接收到的數據變成字節數組//2.創建數據報,包含發送的數據信息DatagramPacket packet = new DatagramPacket(data, data.length, address, port);// 3.創建DatagramSocket對象try {socket.send(packet);// 4.向服務器端發送數據報} catch (IOException e) {e.printStackTrace();}}}).start();new Thread(()->{while (true){/** 接收服務器端響應的數據*/byte[] data2 = new byte[1024];//創建字節數組DatagramPacket packet2 = new DatagramPacket(data2, data2.length);// 1.創建數據報,用于接收服務器端響應的數據try {socket.receive(packet2);// 2.接收服務器響應的數據} catch (IOException e) {e.printStackTrace();}//3.讀取數據String reply = new String(data2, 0, packet2.getLength());//創建字符串對象System.out.println("我是客戶端,服務器說:" + reply);//輸出提示信息}}).start();} }運行結果如下:
 
借鑒文章:https://blog.csdn.net/qq_41182503/article/details/80179961
總結
以上是生活随笔為你收集整理的14.Java实现UDP通信的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 《华为交换机学习指南》学习笔记·二
 - 下一篇: [css] 浏览器是怎样判断元素是否和