亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

app開發實現

開發app的時候利用UDP協議接收數據信息如何實現,Java語言

正在回答

2 回答

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


0 回復 有任何疑惑可以回復我~

這是一個大問題,

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

app開發實現

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號