當前位置:首頁 » 編程語言 » udpsocketjava

udpsocketjava

發布時間: 2024-05-09 13:25:59

Ⅰ 什麼是java socket

事實上網路編程簡單的理解就是兩台計算機相互通訊數據而已,對於程序員而言,去掌握一種編程介面並使用一種編程模型相對就會顯得簡單的多了,Java SDK提供一些相對簡單的Api來完成這些工作。Socket就是其中之一,對於Java而言,這些Api存在與java.net 這個包裡面,因此只要導入這個包就可以准備網路編程了。

網路編程的基本模型就是客戶機到伺服器模型,簡單的說就是兩個進程之間相互通訊,然後其中一個必須提供一個固定的位置,而另一個則只需要知道這個固定的位置。並去建立兩者之間的聯系,然後完成數據的通訊就可以了,這里提供固定位置的通常稱為伺服器,而建立聯系的通常叫做客戶端,基於這個簡單的模型,就可以進入網路編程啦。

Java對這個模型的支持有很多種Api,而這里我只想介紹有關Socket的編程介面,對於Java而言已經簡化了Socket的編程介面。首先我們來討論有關提供固定位置的服務方是如何建立的。Java提供了ServerSocket來對其進行支持.事實上當你創建該類的一個實力對象並提供一個埠資源你就建立了一個固定位置可以讓其他計算機來訪問你,ServerSocket server=new ServerSocket(6789);這里稍微要注意的是埠的分配必須是唯一的。因為埠是為了唯一標識每台計算機唯一服務的,另外埠號是從0~65535之間的,前1024個埠已經被Tcp/Ip 作為保留埠,因此你所分配的埠只能是1024個之後的。好了,我們有了固定位置.現在所需要的就是一根連接線了.該連接線由客戶方首先提出要求。因此Java同樣提供了一個Socket對象來對其進行支持,只要客戶方創建一個Socket的實例對象進行支持就可以了。Socket client
=new Socket(InetAddress.getLocalHost(),5678);客戶機必須知道有關伺服器的IP地址,對於著一點Java也提供了一個相關的類InetAddress 該對象的實例必須通過它的靜態方法來提供,它的靜態方法主要提供了得到本機IP 和通過名字或IP直接得到InetAddress的方法。

上面的方法基本可以建立一條連線讓兩台計算機相互交流了,可是數據是如何傳輸的呢?事實上I/O操作總是和網路編程息息相關的。因為底層的網路是繼續數據的,除非遠程調用,處理問題的核心在執行上,否則數據的交互還是依賴於IO操作的,所以你也必須導入java.io這個包.java的IO操作也不復雜,它提供了針對於位元組流和Unicode的讀者和寫者,然後也提供了一個緩沖用於數據的讀寫。

在網路搜索里輸入java socket會有N多的結果給你答案。

Ⅱ 瘋狂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協議中的埠問題

在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中如何檢測本機指定的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。
希望對您有幫助謝謝

Ⅳ java開發聊天功能用什麼技術比較好


開發聊天功能可以採用以下幾種技術:

  • Socket編程:使用Java Socket編程可以實現基於TCP或UDP的網路通信,這虧畢是Java最基礎、最底層的網路編程技術。使用Socket編程可以實現實時通信、消息推送等功能,但需要自己實現消息協議、數據傳輸等細節。

  • Java NIO:Java NIO(New IO)是Java 1.4之後引入的一種新IO API,它提供了基於事件驅動的非同步IO操作,可以大大提高網路通信效率。使用Java NIO可以實現高並發、高性能的網路通信,但需要掌握NIO的相關概念和使用方式。

  • WebSockets:WebSockets是HTML5標准中新增的一種協議,可以實現基於瀏覽器的實時雙向通信。使用Java開發WebSockets可以實現跨平台、跨瀏覽器的聊天功能,但需要掌握WebSocket協議的相關概念和使用方式。

  • 第三方庫:Java中有許多第三方庫可以用於實現聊天功能,如Netty、Apache MINA、Smack等。這些庫提供了更加簡銷悉芹單、易用的API,可以快速陸升搭建聊天功能,但需要熟悉相關庫的使用方法和特性。

  • 具體選用哪種技術,需要根據具體需求、開發經驗和技術水平等因素進行綜合考慮。

熱點內容
如何清理網頁帳號和登錄密碼 發布:2024-11-27 20:18:53 瀏覽:371
大發明解壓密碼 發布:2024-11-27 20:18:52 瀏覽:502
藍鷗c語言 發布:2024-11-27 20:14:38 瀏覽:813
阿里雲高配伺服器租用 發布:2024-11-27 20:13:40 瀏覽:758
國外圖片上傳 發布:2024-11-27 20:13:31 瀏覽:545
蘋果手機怎麼重置密碼 發布:2024-11-27 20:10:28 瀏覽:532
萬里紅存儲介質信息消除工具 發布:2024-11-27 20:10:13 瀏覽:387
氫怎麼存儲 發布:2024-11-27 20:08:46 瀏覽:837
安卓120w快充哪個好 發布:2024-11-27 19:53:40 瀏覽:478
codesmith資料庫 發布:2024-11-27 19:45:54 瀏覽:356