課程
/后端開發
/Java
/Java Socket應用---通信是這樣練成的
開發app的時候利用UDP協議接收數據信息如何實現,Java語言
2021-05-12
源自:Java Socket應用---通信是這樣練成的 1-1
正在回答
UDP的Java支持
UDP協議提供的服務不同于TCP協議的端到端服務,它是面向非連接的,屬不可靠協議,UDP套接字在使用前不需要進行連接。實際上,UDP協議只實現了兩個功能:
1)在IP協議的基礎上添加了端口;
2)對傳輸過程中可能產生的數據錯誤進行了檢測,并拋棄已經損壞的數據。
Java通過DatagramPacket類和DatagramSocket類來使用UDP套接字,客戶端和服務器端都通過DatagramSocket的send()方法和receive()方法來發送和接收數據,用DatagramPacket來包裝需要發送或者接收到的數據。發送信息時,Java創建一個包含待發送信息的DatagramPacket實例,并將其作為參數傳遞給DatagramSocket實例的send()方法;接收信息時,Java程序首先創建一個DatagramPacket實例,該實例預先分配了一些空間,并將接收到的信息存放在該空間中,然后把該實例作為參數傳遞給DatagramSocket實例的receive()方法。在創建DatagramPacket實例時,要注意:如果該實例用來包裝待接收的數據,則不指定數據來源的遠程主機和端口,只需指定一個緩存數據的byte數組即可(在調用receive()方法接收到數據后,源地址和端口等信息會自動包含在DatagramPacket實例中),而如果該實例用來包裝待發送的數據,則要指定要發送到的目的主機和端口。
UDP的通信建立的步驟
UDP客戶端首先向被動等待聯系的服務器發送一個數據報文。一個典型的UDP客戶端要經過下面三步操作:
1. 創建一個DatagramSocket實例,可以有選擇地對本地地址和端口號進行設置,如果設置了端口號,則客戶端會在該端口號上監聽從服務器端發送來的數據;
2. 使用DatagramSocket實例的send()和receive()方法來發送和接收DatagramPacket實例,進行通信;
3. 通信完成后,調用DatagramSocket實例的close()方法來關閉該套接字。
由于UDP是無連接的,因此UDP服務端不需要等待客戶端的請求以建立連接。另外,UDP服務器為所有通信使用同一套接字,這點與TCP服務器不同,TCP服務器則為每個成功返回的accept()方法創建一個新的套接字。一個典型的UDP服務端要經過下面三步操作:
1. 創建一個DatagramSocket實例,指定本地端口號,并可以有選擇地指定本地地址,此時,服務器已經準備好從任何客戶端接收數據報文;
2. 使用DatagramSocket實例的receive()方法接收一個DatagramPacket實例,當receive()方法返回時,數據報文就包含了客戶端的地址,這樣就知道了回復信息應該發送到什么地方;
3. 使用DatagramSocket實例的send()方法向服務器端返回DatagramPacket實例。
一個程序為服務端,建立UDP服務端套接字。
1
java源程序如下:
import java.io.IOException;//導入IOException類
import java.net.DatagramPacket;//導入DatagramPacket類
import java.net.DatagramSocket;//導DatagramSocket入
import java.net.InetAddress;//導入InetAddress類
import java.util.Scanner;//導入Scanner類
/*
?* 客戶端
?*/
public class UDPClient {//公共類
? ? public static void main(String[] args) throws IOException {//主程序入口
? ? ? ? /*
? ? ? ? ?* 向服務器端發送數據
? ? ? ? ?*/? ? ??
? ? ? ? InetAddress address = InetAddress.getByName("localhost"); // 1.定義服務器的地址、端口號、數據
? ? ? ? int port = 8800;//定義端口類型
? ? ? ?while(true) {//通過循環不同的向客戶端發送和接受數據
? ? ? ? Scanner scanner = new Scanner(System.in);//從鍵盤接受數據
? ? ? ? String send = scanner.nextLine();//nextLine方式接受字符串
? ? ? ? byte[] data = send.getBytes();//將接收到的數據變成字節數組? ? ??
? ? ? ? DatagramPacket packet = new DatagramPacket(data, data.length, address, port);//2.創建數據報,包含發送的數據信息? ? ?
? ? ? ? DatagramSocket socket = new DatagramSocket(); // 3.創建DatagramSocket對象? ? ? ?
? ? ? ? socket.send(packet);// 4.向服務器端發送數據報
? ? ? ? ?* 接收服務器端響應的數據
? ? ? ? byte[] data2 = new byte[1024];//創建字節數組?
? ? ? ? DatagramPacket packet2 = new DatagramPacket(data2, data2.length);// 1.創建數據報,用于接收服務器端響應的數據? ? ? ? ??
? ? ? ? socket.receive(packet2);// 2.接收服務器響應的數據
? ? ? ? //3.讀取數據
? ? ? ? String reply = new String(data2, 0, packet2.getLength());//創建字符串對象
? ? ? ? System.out.println("我是客戶端,服務器說:" + reply);//輸出提示信息
? ? ? ? socket.close();//4.關閉資源
? ? ? ?}
? ? }
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
另外一個程序為客戶端,建立UDP客戶端套接字。
import java.net.DatagramSocket;//導入DatagramSocket類
?* 服務器端,實現基于UDP的用戶登陸
public class UDPServer {//公共類
? ? ? ? ?* 接收客戶端發送的數據
? ? ? ? DatagramSocket socket = new DatagramSocket(8800);? // 1.創建服務器端DatagramSocket,指定端口
? ? ? ? // 2.創建數據報,用于接收客戶端發送的數據
? ? ? ? byte[] data = new byte[1024];//創建字節數組,指定接收的數據包的大小
? ? ? ? DatagramPacket packet = new DatagramPacket(data, data.length);
? ? ? ? // 3.接收客戶端發送的數據
? ? ? ? System.out.println("****服務器端已經啟動,等待客戶端發送數據");//輸出提示信息
? ? ? ?while(true) {//通過循環不停的向客戶端發送數據和接收數據
? ? ? ? socket.receive(packet);// 此方法在接收到數據報之前會一直阻塞
? ? ? ? // 4.讀取數據?
? ? ? ? String info = new String(data, 0, packet.getLength());//創建字符串對象
? ? ? ? System.out.println("我是服務器,客戶端說:" + info);//輸出提示信息? ??
? ? ? ? ?* 向客戶端響應數據
? ? ? ? ?*/
? ? ? ? // 1.定義客戶端的地址、端口號、數據? ??
? ? ? ? InetAddress address = packet.getAddress();//獲取發送端的地址
? ? ? ? int port = packet.getPort();//獲取 發送端進程所綁定的端口??
? ? ? ? Scanner scanner = new Scanner(System.in);//從鍵盤接受數據??
? ? ? ? String send = scanner.nextLine();//nextLine方式接受字符串??
? ? ? ? byte[] data2 = send.getBytes();//將接收到的數據轉換為字節數組
? ? ? ? DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port);// 2.創建數據報,包含響應的數據信息? ? ??
? ? ? ? socket.send(packet2); // 3.響應客戶端??
? ? ? ?}?
————————————————
版權聲明:本文為CSDN博主「qq_41182503」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41182503/article/details/80179961
這是一個大問題,
舉報
分享的是 Java 中的網絡編程,使用Socket實現網絡聊天通信
3 回答編寫一個安卓app,實現通過udp通信解析電腦端發來的json包
2 回答一個客戶端連接發送多次信息如何實現
2 回答怎么實現客戶端與服務器端 不停的相互發消息
2 回答UDP實現多線程
1 回答如何實現多客戶端之間的通信?如何實現并行通信?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2022-01-09
UDP的Java支持
UDP協議提供的服務不同于TCP協議的端到端服務,它是面向非連接的,屬不可靠協議,UDP套接字在使用前不需要進行連接。實際上,UDP協議只實現了兩個功能:
1)在IP協議的基礎上添加了端口;
2)對傳輸過程中可能產生的數據錯誤進行了檢測,并拋棄已經損壞的數據。
Java通過DatagramPacket類和DatagramSocket類來使用UDP套接字,客戶端和服務器端都通過DatagramSocket的send()方法和receive()方法來發送和接收數據,用DatagramPacket來包裝需要發送或者接收到的數據。發送信息時,Java創建一個包含待發送信息的DatagramPacket實例,并將其作為參數傳遞給DatagramSocket實例的send()方法;接收信息時,Java程序首先創建一個DatagramPacket實例,該實例預先分配了一些空間,并將接收到的信息存放在該空間中,然后把該實例作為參數傳遞給DatagramSocket實例的receive()方法。在創建DatagramPacket實例時,要注意:如果該實例用來包裝待接收的數據,則不指定數據來源的遠程主機和端口,只需指定一個緩存數據的byte數組即可(在調用receive()方法接收到數據后,源地址和端口等信息會自動包含在DatagramPacket實例中),而如果該實例用來包裝待發送的數據,則要指定要發送到的目的主機和端口。
UDP的通信建立的步驟
UDP客戶端首先向被動等待聯系的服務器發送一個數據報文。一個典型的UDP客戶端要經過下面三步操作:
1. 創建一個DatagramSocket實例,可以有選擇地對本地地址和端口號進行設置,如果設置了端口號,則客戶端會在該端口號上監聽從服務器端發送來的數據;
2. 使用DatagramSocket實例的send()和receive()方法來發送和接收DatagramPacket實例,進行通信;
3. 通信完成后,調用DatagramSocket實例的close()方法來關閉該套接字。
由于UDP是無連接的,因此UDP服務端不需要等待客戶端的請求以建立連接。另外,UDP服務器為所有通信使用同一套接字,這點與TCP服務器不同,TCP服務器則為每個成功返回的accept()方法創建一個新的套接字。一個典型的UDP服務端要經過下面三步操作:
1. 創建一個DatagramSocket實例,指定本地端口號,并可以有選擇地指定本地地址,此時,服務器已經準備好從任何客戶端接收數據報文;
2. 使用DatagramSocket實例的receive()方法接收一個DatagramPacket實例,當receive()方法返回時,數據報文就包含了客戶端的地址,這樣就知道了回復信息應該發送到什么地方;
3. 使用DatagramSocket實例的send()方法向服務器端返回DatagramPacket實例。
一個程序為服務端,建立UDP服務端套接字。
1
java源程序如下:
import java.io.IOException;//導入IOException類
import java.net.DatagramPacket;//導入DatagramPacket類
import java.net.DatagramSocket;//導DatagramSocket入
import java.net.InetAddress;//導入InetAddress類
import java.util.Scanner;//導入Scanner類
/*
?* 客戶端
?*/
public class UDPClient {//公共類
? ? public static void main(String[] args) throws IOException {//主程序入口
? ? ? ? /*
? ? ? ? ?* 向服務器端發送數據
? ? ? ? ?*/? ? ??
? ? ? ? InetAddress address = InetAddress.getByName("localhost"); // 1.定義服務器的地址、端口號、數據
? ? ? ? int port = 8800;//定義端口類型
? ? ? ?while(true) {//通過循環不同的向客戶端發送和接受數據
? ? ? ? Scanner scanner = new Scanner(System.in);//從鍵盤接受數據
? ? ? ? String send = scanner.nextLine();//nextLine方式接受字符串
? ? ? ? byte[] data = send.getBytes();//將接收到的數據變成字節數組? ? ??
? ? ? ? DatagramPacket packet = new DatagramPacket(data, data.length, address, port);//2.創建數據報,包含發送的數據信息? ? ?
? ? ? ? DatagramSocket socket = new DatagramSocket(); // 3.創建DatagramSocket對象? ? ? ?
? ? ? ? socket.send(packet);// 4.向服務器端發送數據報
? ? ? ? /*
? ? ? ? ?* 接收服務器端響應的數據
? ? ? ? ?*/? ? ??
? ? ? ? byte[] data2 = new byte[1024];//創建字節數組?
? ? ? ? DatagramPacket packet2 = new DatagramPacket(data2, data2.length);// 1.創建數據報,用于接收服務器端響應的數據? ? ? ? ??
? ? ? ? socket.receive(packet2);// 2.接收服務器響應的數據
? ? ? ? //3.讀取數據
? ? ? ? String reply = new String(data2, 0, packet2.getLength());//創建字符串對象
? ? ? ? System.out.println("我是客戶端,服務器說:" + reply);//輸出提示信息
? ? ? ? socket.close();//4.關閉資源
? ? ? ?}
? ? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
另外一個程序為客戶端,建立UDP客戶端套接字。
java源程序如下:
import java.io.IOException;//導入IOException類
import java.net.DatagramPacket;//導入DatagramPacket類
import java.net.DatagramSocket;//導入DatagramSocket類
import java.net.InetAddress;//導入InetAddress類
import java.util.Scanner;//導入Scanner類
/*
?* 服務器端,實現基于UDP的用戶登陸
?*/
public class UDPServer {//公共類
? ? public static void main(String[] args) throws IOException {//主程序入口
? ? ? ? /*
? ? ? ? ?* 接收客戶端發送的數據
? ? ? ? ?*/? ? ??
? ? ? ? DatagramSocket socket = new DatagramSocket(8800);? // 1.創建服務器端DatagramSocket,指定端口
? ? ? ? // 2.創建數據報,用于接收客戶端發送的數據
? ? ? ? byte[] data = new byte[1024];//創建字節數組,指定接收的數據包的大小
? ? ? ? DatagramPacket packet = new DatagramPacket(data, data.length);
? ? ? ? // 3.接收客戶端發送的數據
? ? ? ? System.out.println("****服務器端已經啟動,等待客戶端發送數據");//輸出提示信息
? ? ? ?while(true) {//通過循環不停的向客戶端發送數據和接收數據
? ? ? ? socket.receive(packet);// 此方法在接收到數據報之前會一直阻塞
? ? ? ? // 4.讀取數據?
? ? ? ? String info = new String(data, 0, packet.getLength());//創建字符串對象
? ? ? ? System.out.println("我是服務器,客戶端說:" + info);//輸出提示信息? ??
? ? ? ? /*
? ? ? ? ?* 向客戶端響應數據
? ? ? ? ?*/
? ? ? ? // 1.定義客戶端的地址、端口號、數據? ??
? ? ? ? InetAddress address = packet.getAddress();//獲取發送端的地址
? ? ? ? int port = packet.getPort();//獲取 發送端進程所綁定的端口??
? ? ? ? Scanner scanner = new Scanner(System.in);//從鍵盤接受數據??
? ? ? ? String send = scanner.nextLine();//nextLine方式接受字符串??
? ? ? ? byte[] data2 = send.getBytes();//將接收到的數據轉換為字節數組
? ? ? ? DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port);// 2.創建數據報,包含響應的數據信息? ? ??
? ? ? ? socket.send(packet2); // 3.響應客戶端??
? ? ? ?}?
? ? }
}
————————————————
版權聲明:本文為CSDN博主「qq_41182503」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41182503/article/details/80179961
2021-06-24
這是一個大問題,