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