導航:首頁 > 編程語言 > udp編程java

udp編程java

發布時間:2023-04-07 21:23:03

java問題 UDP協議中的埠問題

在Java中操縱UDP

使用位於JDK中Java.net包下的DatagramSocket和DatagramPacket類,可以非常方便地控制用戶數據報文。

在描述它們之前,必須了解位於同一個位置的InetAddress類。InetAddress實現了Java.io. Serializable介面,不允許繼承。它用於描述和包裝一個Internet IP地址,通過三個方法返回InetAddress實例:

getLocalhost():返回封裝本地地址的實例。

getAllByName(String host):返回封裝Host地址的InetAddress實例數組。

getByName(String host):返回一個封裝Host地址的實例。其中,Host可以是域名或者是一個合法的IP地址。

DatagramSocket類用於創建接收和發送UDP的Socket實例。和Socket類依賴SocketImpl類一樣,DatagramSocket類的實現也依靠專門為它設計的DatagramScoketImplFactory類。DatagramSocket類有3個構建器:

DatagramSocket():創建實例。這是個比較特殊的用法,通常用於客戶端編程,它並沒有特定監聽的埠,僅僅使用一個臨時的。

DatagramSocket(int port):創建實例,並固定監聽Port埠的報文。

DatagramSocket(int port, InetAddress localAddr):這是個非常有用的構建器,當一台機器擁有多於一個IP地址的時候,由它創建的實例僅僅接收來自LocalAddr的報文。

值得注意的是,在創建DatagramSocket類實例時,如果埠已經被使用,會產生一個SocketException的異常拋出,並導致程序非法終止,這個異常應該注意捕獲。DatagramSocket類最主要的方法有4個:

Receive(DatagramPacket d):接收數據報文到d中。receive方法產生一個「阻塞」。

Send(DatagramPacket d):發送報文d到目的地。

SetSoTimeout(int timeout):設置超時時間,單位為毫秒。

Close():關閉DatagramSocket。在應用程序退出的? 焙潁?ǔ;嶂鞫?頭拋試矗?乇誗ocket,但是由於異常地退出可能造成資源無法回收。所以,應該在程序完成時,主動使用此方法關閉Socket,或在捕獲到異常拋出後關閉Socket。

「阻塞」是一個專業名詞,它會產生一個內部循環,使程序暫停在這個地方,直到一個條件觸發。

DatagramPacket類用於處理報文,它將Byte數組、目標地址、目標埠等數據包裝成報文或者將報文拆卸成Byte數組。應用程序在產生數據包是應該注意,TCP/IP規定數據報文大小最多包含65507個,通常主機接收548個位元組,但大多數平台能夠支持8192位元組大小的報文。DatagramPacket類的構建器共有4個:

DatagramPacket(byte[] buf, int length, InetAddress addr, int port):從Buf數組中,取出Length長的數據創建數據包對象,目標是Addr地址,Port埠。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):從Buf數組中,取出Offset開始的、Length長的數據創建數據包對象,目標是Addr地址,Port埠。

DatagramPacket(byte[] buf, int offset, int length):將數據包中從Offset開始、Length長的數據裝進Buf數組。

DatagramPacket(byte[] buf, int length):將數據包中Length長的數據裝進Buf數組。

DatagramPacket類最重要的方法就是getData()了,它從實例中取得報文的Byte數組編碼。

⑵ Java網路編程基本概念是什麼

1、Java網路編程基本概念——主機的網路層


主機網路層定義特定網路介面(如乙太網或WiFi天線)如何通過物理連接將IP數據報發送到本地網路或世界其他地方。在主機網路層中,連接不同計算機的硬體部分(電纜、光纖、無線電波或煙霧信號)有時被稱為網路的物理層。Java程序員不需要擔心這一層,除非出現錯誤,例如計算機後面的插頭脫落或有人切斷了您與外部世界之間的T-1線。換句話說,Java將永遠看不到物理層。


2、Java網路編程基本概念——網路層


Internet層的下一層是主機網路層,這是Java程序員需要考慮的第一層。網際網路層協議定義了數據位和位元組如何組織成更大的組,稱為包,也定義了不同計算機互相查找的定址機制。Internet Protocol (IP)是世界上使用最廣泛的Internet層協議,也是Java唯一了解的Internet層協議。


網際網路協議基本上是兩種協議:IPV4使用32位地址,IPV6使用128位地址,並增加了技術特性來幫助路由。這是兩種完全不同的網路協議,如果沒有特殊的網關/隧道協議,它們甚至不能在同一網路上互操作,但是Java向您隱藏了幾乎所有這些差異。


除了路由和定址之外,網際網路層的第二個作用是使不同類型的主機網路層能夠彼此對話。網際網路路由器在WiFi和乙太網、乙太網和DSL、DSL和光纖往返協議之間進行交換。沒有網際網路層或類似的分層,每台計算機只能與同一類型網路上的其他計算機通信。網際網路層負責使用適當的協議將異類網路彼此連接起來。


3、Java網路編程基本概念——傳輸層


原始數據報有一些缺點。最明顯的缺點是無法保證可靠的傳輸,即使可以保證,也可能在傳輸過程中被損壞。頭檢查只能檢測頭中的損壞,而不能檢測數據報的數據部分。最後,即使數據報沒有損壞地到達了它的目的地,它也可能不能按照發送的順序到達。


傳輸層負責確保按發送的順序接收數據包,確保沒有數據丟失或銷毀。如果數據包丟失,傳輸層要求發送方重新傳輸該數據包。為此,IP網路向每個數據報添加了一個額外的頭,其中包含更多信息。


這個級別有兩個主要協議。第一個是傳輸控制協議(TCP),這是一個昂貴的協議,允許丟失或損壞的數據按照發送順序重新傳輸。第二個協議是用戶數據報協議(User Datagram Protocol, UDP),它允許接收方檢測損壞的數據包,而不保證它們按照正確的順序發送(或者根本不發送)。然而,UDP通常比TCP快。TCP被稱為可靠協議。UDP是不可靠的。


4、Java網路編程基本概念——應用程序層


向用戶交付數據的層稱為應用層。以下三個層定義如何將數據從一台計算機傳輸到另一台計算機。應用層決定數據傳輸後的操作。有HTTP為用戶Web, SMTP, POP, IMAP為用戶電子郵件;FSP, TFTP用於文件傳輸,NFS用於文件訪問;文件共享使用Gnutella和BitTorrent;會話發起協議(SIP)和Skype用於語音通信。此外,您的程序可以在必要時定義自己的應用程序級協議。(頁面)


5、Java網路編程基本概念——IP、TCP、UDP


IP被設計成允許任意兩點之間有多條路由,繞過損壞的路由器來路由數據包。由於兩點之間有多條路由,而且由於網路流量或其他因素,它們之間的最短路徑可能會隨著時間而變化,因此構成特定數據流的數據包可能不會走同一條路由。即使它們全部到達,也可能不是按照它們被發送的順序到達的。為了改進這一基本機制,TCP被放置在IP上,以便連接的兩端可以確認收到的IP數據包,並請求重傳丟失或損壞的數據包。此外,TCP允許接收端上的數據包按照發送的順序重新分組。


然而,TCP有很多開銷。因此,如果單個數據包的丟失不會完全破壞數據,那麼可以使用UDP發送數據包,而不需要TCP提供的保證。UDP是一種不可靠的協議。它不能保證信息包將到達它們的目的地,或者它們將以它們被發送的相同順序到達。


6、Java網路編程基本概念——IP地址和域名


IPv4網路上的每台計算機都有一個4位元組的數字ID。通常在一個點上以四段格式寫,比如192.1.32.90,每個數字是一個無符號位元組,范圍從0到255。IPv4網路上的每台計算機都有一個唯一的四段地址。當數據通過網路傳輸時,包的報頭包括要發送到的機器的地址(目的地址)和要發送到的機器的地址(源地址)。路由上的路由器通過檢查目的地址來選擇發送包的最佳路徑。包含源地址是為了讓收件人知道該對誰進行回復。


雖然計算機可以很容易地處理數字,但人類並不擅長記住它們。因此,域名系統(DNS)被開發出來,用來將容易記住的主機名(如www.12345.com)轉換成數字互聯網地址(如208.201.243.99)。當Java程序訪問網路時,它們需要同時處理數字地址和相應的主機名。這些方法由java.net.InetAddress類提供。


7、Java網路編程基本概念——港口


如果每台計算機一次只做一件事,地址就足夠了。但是現代計算機同時做許多不同的事情。電子郵件需要與FTP請求分開,而FTP請求也需要與Web通信分開。這是通過埠完成的。具有IP地址的每台計算機有數千個邏輯埠(確切地說,每個傳輸層協議有65,535個埠)。這些只是計算機內存中的抽象,不代表任何物理對象,不像USB埠。每個埠在1到65535之間進行數字標識。每個埠可以分配給一個特定的服務。


8、Java網路編程基本概念——一個防火牆


在互聯網上有一些頑皮的人。要排除它們,通常需要在本地網路上設置一個接入點,並檢查進出該接入點的所有流量。位於網際網路和本地網路之間的一些硬體和軟體會檢查所有輸入和輸出的數據,以確保它是防火牆。防火牆通常是路由器的一部分,它將本地網路連接到更大的網際網路,並可以執行其他任務,如網路地址轉換。另外,防火牆可以是單獨的機器。防火牆仍然主要負責檢查進出其網路介面的數據包,根據一組規則接收或拒絕數據包。


本篇《什麼是Java網路編程基本概念?看完這篇文章你一定可以明白》到這里就已經結束了,小編一直認為,某一個編程軟體受歡迎是有一定原因的,首先吸引人的一定是其功能,環球網校的小編祝您java學習之路順利,如果你還想知道更多java知識,也可以點擊本站的其他文章進行學習。

⑶ java中如何檢測本機指定的UDP服務埠是否被佔用並且自動分配一個可用udp埠;

1.埠佔用編譯器會報錯,可以從錯誤看出來是不是埠被佔用。沒有專門的檢測工具和方法
2.DatagramSocket(在Java中使用UDP協議編程的相關類)
用於接收和發送UDP的Socket實例。該類有3個構造函數:
DatagramSocket():通常用於客戶端編程,它並沒有特定監聽的埠,僅僅使用一個臨時的。程序會讓操作系統分配一個可用的埠。
DatagramSocket(int port):創建實例,並固定監聽Port埠的報文。通常用於服務端
DatagramSocket(int port, InetAddress localAddr):這是個非常有用的構建器,當一台機器擁有多於一個IP地址的時候,由它創建的實例僅僅接收來自LocalAddr的報文。
DatagramSocket具有的主要方法如下:
1)receive(DatagramPacket d):接收數據報文到d中。receive方法產生一個「阻塞」。「阻塞」是一個專業名詞,它會產生一個內部循環,使程序暫停在這個地方,直到一個條件觸發。

2)send(DatagramPacket dp):發送報文dp到目的地。

3)setSoTimeout(int timeout):設置超時時間,單位為毫秒。

4)close():關閉DatagramSocket。在應用程序退出的時候,通常會主動釋放資源,關閉Socket,但是由於異常地退出可能造成資源無法回收。所以,應該在程序完成時,主動使用此方法關閉Socket,或在捕獲到異常拋出後關閉Socket。
希望對您有幫助謝謝

⑷ 在javasocket網路編程中,開發基於udp協議的程序使用的套接字有哪些

一、 填空題

___ IP地址____用來標志網路中的一個通信實體的地址。通信實體可以是計算機,路由器等。
統一資源定位符URL是指向互聯網「資源」的指針,由4部分組成:協議、存放資源的主機域名、__埠___和資源路徑和文件名。
URL 是統一資源定位器的簡稱,它表示Internet上某一資源的地址。
在Socket編程中,IP地址用來標志一台計算機,但是一台計算機上可能提供多種應用程序,使用 埠 來區分這些應用程序。
在Java Socket網路編程中,開發基於TCP協議的伺服器端程序使用的套接字是 ServerSocket 。
在Java Socket網路編程中,開發基於UDP協議的程序使用的套接字是 DatagramSocket 。
二、 選擇題

1.以下協議都屬於TCP/IP協議棧,其中位於傳輸層的協議是(AD)。(選擇二項)
A TCP
B.HTTP
C.SMTP
D.UDP
2.以下協議中屬於TCP/IP協議棧中應用層協議的是(A)。(選擇一項)
A HTTP
B.TCP
C.UDP
D.IP
3.以下說法中關於UDP協議的說法正確的是(AD)。(選擇二項)
A.發送不管對方是否准備好,接收方收到也不確認
B.面向連接
C.佔用系統資源多、效率低
D.非常簡單的協議,可以廣播發送
4.在基於TCP網路通信模式中,客戶與伺服器程序的主要任務是(BC)。(選擇二項)
A 客戶程序在網路上找到一條到達伺服器的路由
B.客戶程序發送請求,並接收伺服器的響應
C.伺服器程序接收並處理客戶請求,然後向客戶發送響應結果
D.如果客戶程序和伺服器都會保證發送的數據不會在傳輸途中丟失
5.在Java網路編程中,使用客戶端套接字Socket創建對象時,需要指定(A)。慧宏(選擇一項)
A 伺服器主機名稱和埠
B.伺服器埠和文件
C.伺服器名稱和文件
D.伺服器地址和文件
6.ServerSocket的監聽滑碧尺方法accept( )方法的返回值類型是(A )。(選擇一項)
A.Socket
B.Void
C.Object
D.DatagramSocket
7.Java UDP Socket編程主要用到的兩個類是(BD)。(選擇二項信高)
A UDPSocket
B.DatagramSocket
C.UDPPacket
D.DatagramPacket
8.在使用UDP套接字通信時,常用(D)類把要發送的信息打包。(選擇一項)
A String
B.DatagramSocket
C.MulticastSocket
D.DatagramPacket

三、 判斷題

1. Socket是傳輸層供給應用層的編程介面,是應用層與傳輸層之間的橋梁 。( T )
2. TCP/IP傳輸控制協議是Internet的主要協議,定義了計算機和外設進行通信的規則。TCP/IP網路參考模型包括七個層次:應用層、會話層、表示層、傳輸層、網路層、鏈路層和物理層。( F )
3. TCP協議一種面向連接的、可靠的、基於位元組流的通信協議 。HTTP、FTP、TELNET、SMTP 都是基於TCP協議的應用層協議。( T )
4. UDP協議是一種面向無連接的、可靠的、基於位元組流的傳輸層通信協議,該協議佔用系統資源多、效率較低。( F )

四、 簡答題

1.TCP/IP協議棧中,TCP協議和UDP協議的聯系和區別?

2.簡述基於TCP的Socket編程的主要步驟。提示:分別說明伺服器端和客戶端的編程步驟。

3.簡述基於UDP的Socket編程的主要步驟。提示:分別說明伺服器端和客戶端的編程步驟。

五、 編碼題

1.使用基於TCP的Java Socket編程,完成如下功能:

1) 要求從客戶端錄入幾個字元,發送到伺服器端。

2) 由伺服器端將接收到的字元進行輸出。

3) 伺服器端向客戶端發出「您的信息已收到」作為響應。

4) 客戶端接收伺服器端的響應信息。

提示:

伺服器端:PrintWriter out =new PrintWriter(socket.getOutputStream(),true);

客戶端:BufferedReader line=new BufferedReader(new InputStreamReader(System.in));

⑸ java網路編程:程序問題,接收不到數據

這是java網路編程里的UDPServer和UDPClient之間簡單通宏仿信程序啊,等等我看看你的程序再說

你想要的是不是這種效果?


import java.net.*;


class UdpSend{

public static void main(String[] args)throws Exception{

//1.創建udp服務,通過DatagramSocket對象

DatagramSocket ds = new DatagramSocket(8888);//---這兒的埠號不要和UdpRece的一樣


//2.確定數據,並封裝成數據包。

//DatagramPacket(byte[] buf, int length, InetAddress address,


int port)

//構造數據報包,用正豎來將長度為 length 的包發送到指定主機上的


指定埠號。

byte[] buf = "udp shu ju lai le".getBytes();

DatagramPacket dp =

new DatagramPacket(buf,buf.length,InetAddress.getByName


("169.254.200.14"),10000);//----這兒的埠號保持與UdpRece一樣


//3.通過Socket服務,將已有的數據包發送出去。通過send方法。

ds.send(dp);


//4.關閉資源

蔽清纖 ds.close();

}

}

最後想說,先運行UdpRece 再運行UdpSend,反過來UdpSend要運行2遍

⑹ 使用Java網路編程編寫SIP消息的收發,TCP和UDP有什麼區別

目前通用的編程語言有兩種形式:匯編語言和高級語言。

匯編語言的實質和機器語言是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的標識符,更容易識別和記憶。它同樣需要編程者將每一步具體的操作用命令的形式寫出來。匯編程序通常由三部分組成:指令、偽指令和宏指令。匯編程序的每一句指令只能對應實際操作過程中的一個很細微的動作,例如移動、自增,因此匯編源程序一般比較冗長、復雜、容易出錯,而且使用匯編語言編程需要有更多的計算機專業知識,但匯編語言的優點也是顯而易見的,用匯編語言所能完成的操作不是一般高級語言所能實現的,而且源程序經匯編生成的可執行文件不僅比較小,而且執行速度很快。

高級語言是目前絕大多數編程者的選擇。和匯編語言相比,它不但將許多相關的機器指令合成為單條指令,並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指令。同時,由於省略了很多細節,編程者也就不需要有太多的專業知識。

高級語言主要是相對於匯編語言而言,它並不是特指某一種具體的語言,而是包括了很多編程語言,如目前流行的VB、VC、FoxPro、Delphi等,這些語言的語法、命令格式都各不相同。

高級語言所編制的程序不能直接被計算機識別,必須經過轉換才能被執行,按轉換方式可將它們分為兩類:

解釋類:執行方式類似於我們日常生活中的「同聲翻譯」,應用程序源代碼一邊由相應語言的解釋器「翻譯」成目標代碼(機器語言),一邊執行,因此效率比較低,而且不能生成可獨立執行的可執行文件,應用程序不能脫離其解釋器,但這種方式比較靈活,可以動態地調整、修改應用程序。

編譯類:編譯是指在應用源程序執行之前,就將程序源代碼「翻譯」成目標代碼(機器語言),因此其目標程序可以脫離其語言環境獨立執行,使用比較方便、效率較高。但應用程序一旦需要修改,必須先修改源代碼,再重新編譯生成新的目標文件(* .OBJ)才能執行,只有目標文件而沒有源代碼,修改很不方便。現在大多數的編程語言都是編譯型的,例如Visual C++、Visual Foxpro、Delphi等。

⑺ 瘋狂Java講義:使用DatagramSocket發送、接收數據[2]

程序客戶端代碼也與此類似 客戶端採用循環不斷地讀取用戶鍵盤輸入 每當讀到用戶輸入內容後就將該內容封裝成DatagramPacket數據報 再將該數據報發送出去 接著把DatagramSocket中的數據讀入接收用的DatagramPacket中(實際上是讀入該DatagramPacket所封裝的位元組數組中) 客旁和戶端代碼如下

程序清單 codes/ / /UdpClient java

public class UdpClient

{

//定義發送數據報的目的地

public static final int DEST_PORT = ;

public static final String DEST_IP = ;

//定義每個數據報的最大大小為 K

private static final int DATA_LEN = ;

//定義該客戶端使用的DatagramSocket

private DatagramSocket socket = null;

//定義接收網路數據的位元組數組

byte[] inBuff = new byte[DATA_LEN];

//以指定位元組數組創建准攔兄備接受數據的DatagramPacket對象

private DatagramPacket inPacket =

new DatagramPacket(inBuff inBuff length)

//定義一個用於發送的DatagramPacket對象

private DatagramPacket outPacket = null;

public void init()throws IOException

{

try

{

//創建一個客戶端DatagramSocket 使用隨機埠

socket = new DatagramSocket()

//初始化發送用的DatagramSocket 它包含一個長度為 的位元組數組

簡啟襲outPacket = new DatagramPacket(new byte[ ]

InetAddress getByName(DEST_IP) DEST_PORT)

//創建鍵盤輸入流

Scanner scan = new Scanner(System in)

//不斷讀取鍵盤輸入

while(scan hasNextLine())

{

//將鍵盤輸入的一行字元串轉換位元組數組

byte[] buff = scan nextLine() getBytes()

//設置發送用的DatagramPacket里的位元組數據

outPacket setData(buff)

//發送數據報

socket send(outPacket)

//讀取Socket中的數據 讀到的數據放在inPacket所封裝的位元組數組里

socket receive(inPacket)

System out println(new String(inBuff

inPacket getLength()))

}

}

//使用finally塊保證關閉資源

finally

{

if (socket != null)

{

socket close()

}

}

}

public static void main(String[] args)

throws IOException

{

new UdpClient() init()

}

}

上面程序的粗體字代碼同樣也是通過DatagramSocket發送 接收DatagramPacket的關鍵代碼 這些代碼與伺服器的代碼基本相似 而客戶端與伺服器端的唯一區別在於 伺服器所在IP地址 埠是固定的 所以客戶端可以直接將該數據報發送給伺服器 而伺服器則需要根據接收到的數據報來決定將 反饋 數據報的目的地

讀者可能會發現 使用DatagramSocket進行網路通信時 伺服器端無須 也無法保存每個客戶端的狀態 客戶端把數據報發送到伺服器後 完全有可能立即退出 但不管客戶端是否退出 伺服器無法知道客戶端的狀態

當使用UDP協議時 如果想讓一個客戶端發送的聊天信息可被轉發到其他所有客戶端則比較困難 可以考慮在伺服器使用Set來保存所有客戶端信息 每當接收到一個客戶端的數據報之後 程序檢查該數據報的源SocketAddress是否在Set集合中 如果不在就將該SocketAddress添加到該Set集合中 但這樣一來又涉及一個問題 可能有些客戶端發送一個數據報之後永久性地退出了程序 但伺服器端還將該客戶端的SocketAddress保存在Set集合中……總之 這種方式需要處理的問題比較多 編程比較煩瑣 幸好Java為UDP協議提供了MulticastSocket類 通過該類可以輕松實現多點廣播

返回目錄 瘋狂Java講義

編輯推薦

Java程序性能優化 讓你的Java程序更快 更穩定

新手學Java 編程

Java程序設計培訓視頻教程

lishixin/Article/program/Java/hx/201311/27260

⑻ Java UDP 編程,通過Datagram傳輸list

二個方法,1位元組傳輸,使用對象序列化答轎.ObjectInputStream ObjectOutputStream ,
2.字清讓肆符傳輸,轉json傳輸滑迅

閱讀全文

與udp編程java相關的資料

熱點內容
php論壇實訓報告 瀏覽:403
java日期字元串轉換成日期 瀏覽:135
linuxsftp連接 瀏覽:934
光伏日發電量演算法 瀏覽:125
小肚皮app怎麼才有vip 瀏覽:616
php全形轉換半形 瀏覽:927
java字元序列 瀏覽:539
杭州編譯分布式存儲區塊鏈 瀏覽:575
材料壓縮曲線 瀏覽:247
linux命令排序 瀏覽:151
手機熱點加密為啥連接不上電腦 瀏覽:979
編譯器合並計算 瀏覽:959
android音頻曲線 瀏覽:343
linuxftp自動登錄 瀏覽:802
運行編譯後網頁 瀏覽:70
閱讀app怎麼使用 瀏覽:319
centos防火牆命令 瀏覽:432
命令行變更 瀏覽:332
linux設備和驅動 瀏覽:207
加密貨幣騙局破案 瀏覽:345