java udp socket,java -UDP通信

 2023-10-18 阅读 31 评论 0

摘要:UDP通信 DatagramPacket 前面介紹了UDP是一種面向無連接的協議,因此,在通信時發送端和接收端不用建立連接。UDP通信的過程就像是貨運公司在兩個碼頭間發送貨物一樣。在碼頭發送和接收貨物時都需要使用集裝箱來裝載貨物,UDP通信也是一樣,發送和接

UDP通信

DatagramPacket

前面介紹了UDP是一種面向無連接的協議,因此,在通信時發送端和接收端不用建立連接。UDP通信的過程就像是貨運公司在兩個碼頭間發送貨物一樣。在碼頭發送和接收貨物時都需要使用集裝箱來裝載貨物,UDP通信也是一樣,發送和接收的數據也需要使用“集裝箱”進行打包,為此JDK中提供了一個DatagramPacket類,該類的實例對象就相當于一個集裝箱,用于封裝UDP通信中發送或者接收的數據

想要創建一個DatagramPacket對象,首先需要了解一下它的構造方法。在創建發送端和接收端的DatagramPacket對象時,使用的構造方法有所不同,接收端的構造方法只需要接收一個字節數組來存放接收到的數據,而發送端的構造方法不但要接收存放了發送數據的字節數組,還需要指定發送端IP地址和端口號。

接下來根據API文檔的內容,對DatagramPacket的構造方法進行逐一詳細地講解。

使用該構造方法在創建DatagramPacket對象時,指定了封裝數據的字節數組和數據的大小,沒有指定IP地址和端口號。很明顯,這樣的對象只能用于接收端,不能用于發送端。因為發送端一定要明確指出數據的目的地(ip地址和端口號),而接收端不需要明確知道數據的來源,只需要接收到數據即可。

使用該構造方法在創建DatagramPacket對象時,不僅指定了封裝數據的字節數組和數據的大小,還指定了數據包的目標IP地址(addr)和端口號(port)。該對象通常用于發送端,因為在發送數據時必須指定接收端的IP地址和端口號,就好像發送貨物的集裝箱上面必須標明接收人的地址一樣。

上面我們講解了DatagramPacket的構造方法,接下來對DatagramPacket類中的常用方法進行詳細地講解,如下表所示。

?DatagramSocket

DatagramPacket數據包的作用就如同是“集裝箱”,可以將發送端或者接收端的數據封裝起來。然而運輸貨物只有“集裝箱”是不夠的,還需要有碼頭。在程序中需要實現通信只有DatagramPacket數據包也同樣不行,為此JDK中提供的一個DatagramSocket類。DatagramSocket類的作用就類似于碼頭,使用這個類的實例對象就可以發送和接收DatagramPacket數據包,發送數據的過程如下圖所示。

?

在創建發送端和接收端的DatagramSocket對象時,使用的構造方法也有所不同,下面對DatagramSocket類中常用的構造方法進行講解。

發送端

該構造方法用于創建發送端的DatagramSocket對象,在創建DatagramSocket對象時,并沒有指定端口號,此時,系統會分配一個沒有被其它網絡程序所使用的端口號。

接收端

該構造方法既可用于創建接收端的DatagramSocket對象,又可以創建發送端的DatagramSocket對象,在創建接收端的DatagramSocket對象時,必須要指定一個端口號,這樣就可以監聽指定的端口。

上面我們講解了DatagramSocket的構造方法,接下來對DatagramSocket類中的常用方法進行詳細地講解。

UDP網絡程序

講解了DatagramPacketDatagramSocket的作用,接下來通過一個案例來學習一下它們在程序中的具體用法。

要實現UDP通信需要創建一個發送端程序和一個接收端程序,很明顯,在通信時只有接收端程序先運行才能避免因發送端發送的數據無法接收,而造成數據丟失。因此,首先需要來完成接收端程序的編寫

利用多線程實現發送端與接收端信息交互

package com.oracle.UDPTest;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;public class TestUDP {public static void main(String[] args) {//創建UDPSender發送端多線程對象Thread sender = new Thread(new UDPSender(),"發送端");//創建UDPReveice接收端對象Thread receiver = new Thread(new UDPReceiver(),"接收端");//開啟線程
        sender.start();receiver.start();}
}//創建發送端類并實現Runnable接口
class UDPSender implements Runnable{//重寫run方法public void run() {//創建DatagramSocket對象DatagramSocket ds = null ;try {//發送端在構造DatagramSocket時不需要傳參ds = new DatagramSocket();//利用InetAddress類獲取本地InetAddress類對象InetAddress address = InetAddress.getLocalHost();//創建Scanner 對象,用來獲取用戶輸入Scanner sc = new Scanner(System.in);while(true) {System.out.println("<"+Thread.currentThread().getName()+">請輸入您要發送的內容:");//獲取用戶輸入String info = sc.next();    //利用用戶輸入創建byte類型數組byte[] bytes = info.getBytes();//獲取數組長度int length = bytes.length;//創建DatagramPacket對象DatagramPacket dp = new DatagramPacket(bytes,length,address,8088);//發送
                ds.send(dp);}} catch ( IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();}finally {//關閉資源
            ds.close();}        }
}
//創建接收端類并實現Runnable接口
class UDPReceiver implements Runnable{public void run() {//創建DatagramSocket對象DatagramSocket ds = null;try {//接收端在構造時必須明確端口ds = new DatagramSocket(8088);//自定義數組byte[] bytes = new byte[1024];//創建DatagramPacket對象DatagramPacket dp = new DatagramPacket(bytes,bytes.length);//循環接收消息while(true) {            //接收消息(沒有接受到消息就會一直阻塞)
                ds.receive(dp);//打印消息System.err.println("<"+Thread.currentThread().getName()+">ip:"+dp.getAddress()+"端口:"+dp.getPort()+"內容:"+new String(dp.getData(),0,dp.getLength()));}} catch (IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();}finally {//關閉資源
            ds.close();}}
}

?

java udp socket?轉載于:https://www.cnblogs.com/miaoxingren/p/9558299.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/149769.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息