Java实现UDP功能
部分內容參考
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
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.關閉資源}} }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.響應客戶端 } } }總結
以上是生活随笔為你收集整理的Java实现UDP功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [vue] vue常用的修饰符有哪些?列
- 下一篇: GPS导航电文编码与校验