<label id="2a06w"><tt id="2a06w"></tt></label><label id="2a06w"><tt id="2a06w"><em id="2a06w"></em></tt></label><menu id="2a06w"></menu>
  • <dfn id="2a06w"><var id="2a06w"><label id="2a06w"></label></var></dfn>
    <sup id="2a06w"><button id="2a06w"><em id="2a06w"></em></button></sup>
    <dfn id="2a06w"><var id="2a06w"></var></dfn>
    <dfn id="2a06w"></dfn>
  • <dfn id="2a06w"><code id="2a06w"><ins id="2a06w"></ins></code></dfn>
  • <small id="2a06w"><samp id="2a06w"></samp></small>
  • <dfn id="2a06w"><table id="2a06w"><center id="2a06w"></center></table></dfn>
    <label id="2a06w"><tt id="2a06w"><em id="2a06w"></em></tt></label>
    <strike id="2a06w"><form id="2a06w"></form></strike>
    <menu id="2a06w"><tt id="2a06w"></tt></menu>

    將想法與焦點(diǎn)和您一起共享

    Java網(wǎng)絡(luò)編程基礎(chǔ)(三) Datagram類使用方法發(fā)布者:本站     時(shí)間:2020-05-06 16:05:13

    Datagram(數(shù)據(jù)包)是一種盡力而為的傳送數(shù)據(jù)的方式,它只是把數(shù)據(jù)的目的地記錄在數(shù)據(jù)包中,然后就直接放在網(wǎng)絡(luò)上,系統(tǒng)不保證數(shù)據(jù)是否能安全送到,或者什么時(shí)候可以送到,也就是說(shuō)它并不保證傳送質(zhì)量。

    1 UDP套接字

    數(shù)據(jù)報(bào)(Datagram)是網(wǎng)絡(luò)層數(shù)據(jù)單元在介質(zhì)上傳輸信息的一種邏輯分組格式,它是一種在網(wǎng)絡(luò)中傳播的、獨(dú)立的、自身包含地址信息的消息,它能否到達(dá)目的地、到達(dá)的時(shí)間、到達(dá)時(shí)內(nèi)容是否會(huì)變化不能準(zhǔn)確地知道。它的通信雙方是不需要建立連接的,對(duì)于一些不需要很高質(zhì)量的應(yīng)用程序來(lái)說(shuō),數(shù)據(jù)報(bào)通信是一個(gè)非常好的選擇。還有就是對(duì)實(shí)時(shí)性要求很高的情況,比如在實(shí)時(shí)音頻和視頻應(yīng)用中,數(shù)據(jù)包的丟失和位置錯(cuò)亂是靜態(tài)的,是可以被人們所忍受的,但是如果在數(shù)據(jù)包位置錯(cuò)亂或丟失時(shí)要求數(shù)據(jù)包重傳,就是用戶所不能忍受的,這時(shí)就可以利用UDP協(xié)議傳輸數(shù)據(jù)包。在Java的java.net包中有兩個(gè)類DatagramSocket和DatagramPacket,為應(yīng)用程序中采用數(shù)據(jù)報(bào)通信方式進(jìn)行網(wǎng)絡(luò)通信。

    使用數(shù)據(jù)包方式首先將數(shù)據(jù)打包,Java.net包中的DategramPacket類用來(lái)創(chuàng)建數(shù)據(jù)包。數(shù)據(jù)包有兩種,一種用來(lái)傳遞數(shù)據(jù)包,該數(shù)據(jù)包有要傳遞到的目的地址;另一種數(shù)據(jù)包用來(lái)接收傳遞過來(lái)的數(shù)據(jù)包中的數(shù)據(jù)。要?jiǎng)?chuàng)建接收的數(shù)據(jù)包,通過DatagramPackett類的方法構(gòu)造:

    public DatagramPacket(byte ibuft[],int ilength)

    public DatagramPacket( byte ibuft[],int offset ,int ilength)

    ibuf[]為接受數(shù)據(jù)包的存儲(chǔ)數(shù)據(jù)的緩沖區(qū)的長(zhǎng)度,ilength為從傳遞過來(lái)的數(shù)據(jù)包中讀取的字節(jié)數(shù)。當(dāng)采用第一種構(gòu)造方法時(shí),接收到的數(shù)據(jù)從ibuft[0]開始存放,直到整個(gè)數(shù)據(jù)包接收完畢或者將ilength的字節(jié)寫入ibuft為止。采用第二種構(gòu)造方法時(shí),接收到的數(shù)據(jù)從ibuft[offset]開始存放。如果數(shù)據(jù)包長(zhǎng)度超出了ilength,則觸發(fā)IllegalArgument-Exception。不過這是RuntimeException,不需要用戶代碼捕獲。示范代碼如下:

    byte[ ] buffer=new byte[8912];

    DatagramPacket datap=new DatagramPacket(buffer ,buffer.length( ));

    創(chuàng)建發(fā)送數(shù)據(jù)包的構(gòu)造方法為:

    public DatagramPacket(byt ibuf[],int ilength,InetAddrss iaddr,int port)

    public DatagramPacket(byt ibuf[],int offset , int ilength,InetAddrss iaddr,int port)

    iaddr為數(shù)據(jù)包要傳遞到的目標(biāo)地址,port為目標(biāo)地址的程序接受數(shù)據(jù)包的端口號(hào)(即目標(biāo)地址的計(jì)算機(jī)上運(yùn)行的客戶程序是在哪一個(gè)端口接收服務(wù)器發(fā)送過來(lái)的數(shù)據(jù)包)。ibuf[]為要發(fā)送數(shù)據(jù)的存儲(chǔ)區(qū),以ibuf數(shù)組的offset位置開始填充數(shù)據(jù)包ilength字節(jié),如果沒有offset,則從ibuf數(shù)組的0位置開始填充。以下示范代碼是要發(fā)送一串字符串:


    String s = new String("java networking");
    byte[ ] data=s.getbytes();
    int port=1024;
    try{
    InetAddress ineta= InetAddress.getByName(" 169.254.0.14");
    DatagramPacket datap=new DatagramPacket
    (data ,data.length( ),ineta,port);
    }
    catch(IOException e) {
    }
     

    數(shù)據(jù)包也是對(duì)象,也有操作方法用來(lái)獲取數(shù)據(jù)包的信息,這是很有用的。其方法如下:

    public InetAddress getAddress() 如果是發(fā)送數(shù)據(jù)包,則獲得數(shù)據(jù)包要發(fā)送的目標(biāo)地址,但是如果是接收數(shù)據(jù)包則返回發(fā)送此數(shù)據(jù)包的源地址。

     

    public byte[]getData()

    返回一個(gè)字節(jié)數(shù)組,其中是數(shù)據(jù)包的數(shù)據(jù)。如果想把字節(jié)數(shù)組轉(zhuǎn)換成別的類型就要進(jìn)行轉(zhuǎn)化。如果想轉(zhuǎn)化成String類型,可以進(jìn)行以下的處理,設(shè)DatagramPacket datap為:

    String s = new String(datap.getbytes());

    public int getLength() 獲得數(shù)據(jù)包中數(shù)據(jù)的字節(jié)數(shù)。

    pubic int getPort( ) 返回?cái)?shù)據(jù)包中的目標(biāo)地址的主機(jī)端口號(hào)。

    發(fā)送和接收數(shù)據(jù)包還需要發(fā)送和接收數(shù)據(jù)包的套接字,即DatagramSocket對(duì)象,DatagramSocket套接字在本地機(jī)器端口監(jiān)聽是否有數(shù)據(jù)到達(dá)或者將數(shù)據(jù)包發(fā)送出去。其構(gòu)造方法如下。

    public DatagramSocket() 用本地機(jī)上任何一個(gè)可用的端口創(chuàng)建一個(gè)套接字,這個(gè)端口號(hào)是由系統(tǒng)隨機(jī)產(chǎn)生的。使用方法如下:


    try{
    DatagramSocket datas=new DatagramSocket( );
    //發(fā)送數(shù)據(jù)包
    }
    catch(SocketException e){
    }
     

    這種構(gòu)造方法沒有指定端口號(hào),可以用在客戶端。如果構(gòu)造不成功則觸發(fā)SocketException異常。

    public DatagramSocket(int port)

    用一個(gè)指定的端口號(hào)port創(chuàng)建一個(gè)套接字。

    當(dāng)不能創(chuàng)建套接字時(shí)就拋出SocketException異常,其原因是指定的端口已被占用或者是試圖連接低于1024的端口,但是又沒有具備權(quán)限。

    2 實(shí)例:利用DatagramSocket查詢端口占用情況

    我們可以利用這個(gè)異常探查本地機(jī)的端口號(hào)有沒有服務(wù)。見示例12-9。

    【程序源代碼】


    1 // ==================== Program Description =====================
    2 // 程序名稱:示例12-9: UDPScan.java
    3 // 程序目的:熟悉DatagramSocket的基本用法,查詢端口的占用情況
    4 //=========================================================
    5 import java.net.*;
    6
    7 public class UDPScan
    8 {
    9 public static void main(String args[])
    10 {
    11 for (int port=1024;port<=65535;port++) {
    12 try {
    13 DatagramSocket server=new DatagramSocket(port);
    14 server.close();
    15 }
    16 catch(SocketException e) {
    17 System.out.println("there is a server in port "+port+".");
    18 }
    19 }
    20 }
    21 }
     

    【程序輸出結(jié)果】

    there is a server in port 1026.

    there is a server in port 1028.

    there is a server in port 1046.

    there is a server in port 1900.

    【程序注解】

    在第11~19行我們用for循環(huán)以端口號(hào)為參數(shù)實(shí)例化DatagramSocket,其中端口號(hào)從1024到65535。如果在實(shí)例過程中出錯(cuò),會(huì)拋出SocketException異常。我們根據(jù)這個(gè)異常就可以判斷出哪些端口被占用,哪些還是空閑的。值得一提的是,我們?cè)趯?shí)例化了DatagramSocket后,調(diào)用了close()關(guān)閉它。作為一種好的作風(fēng),應(yīng)該遵循。端口號(hào)在1024以下的系統(tǒng)可能會(huì)用到,比如HTTP默認(rèn)為80端口,F(xiàn)TP默認(rèn)為21端口,等等,所以我們從1024端口開始探查。



    選擇我們,優(yōu)質(zhì)服務(wù),不容錯(cuò)過
    1. 優(yōu)秀的網(wǎng)絡(luò)資源,強(qiáng)大的網(wǎng)站優(yōu)化技術(shù),穩(wěn)定的網(wǎng)站和速度保證
    2. 15年上海網(wǎng)站建設(shè)經(jīng)驗(yàn),優(yōu)秀的技術(shù)和設(shè)計(jì)水平,更放心
    3. 全程省心服務(wù),不必?fù)?dān)心自己不懂網(wǎng)絡(luò),更省心。
    ------------------------------------------------------------
    24小時(shí)聯(lián)系電話:021-58370032
    99人妻中文字幕视频在,亚洲无码视频在线免费看,久久国产乱子伦免费精品,日本中文字幕色视频网站
    <label id="2a06w"><tt id="2a06w"></tt></label><label id="2a06w"><tt id="2a06w"><em id="2a06w"></em></tt></label><menu id="2a06w"></menu>
  • <dfn id="2a06w"><var id="2a06w"><label id="2a06w"></label></var></dfn>
    <sup id="2a06w"><button id="2a06w"><em id="2a06w"></em></button></sup>
    <dfn id="2a06w"><var id="2a06w"></var></dfn>
    <dfn id="2a06w"></dfn>
  • <dfn id="2a06w"><code id="2a06w"><ins id="2a06w"></ins></code></dfn>
  • <small id="2a06w"><samp id="2a06w"></samp></small>
  • <dfn id="2a06w"><table id="2a06w"><center id="2a06w"></center></table></dfn>
    <label id="2a06w"><tt id="2a06w"><em id="2a06w"></em></tt></label>
    <strike id="2a06w"><form id="2a06w"></form></strike>
    <menu id="2a06w"><tt id="2a06w"></tt></menu>