成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Java 網(wǎng)絡(luò)編程

_ivan / 2301人閱讀

摘要:的基本網(wǎng)絡(luò)支持使用類(lèi)沒(méi)有提供構(gòu)造器,而提供了兩個(gè)靜態(tài)方法來(lái)獲取實(shí)例根據(jù)主機(jī)獲取對(duì)應(yīng)的對(duì)象根據(jù)原始地址來(lái)獲取對(duì)應(yīng)的對(duì)象還提供了如下三個(gè)方法來(lái)獲取實(shí)例對(duì)應(yīng)的地址和主機(jī)名獲取此地址的全限定域名返回該實(shí)例對(duì)應(yīng)的地址字符串以字符串形式獲取此地址的主機(jī)

Java的基本網(wǎng)絡(luò)支持 使用InetAddress

InetAddress類(lèi)沒(méi)有提供構(gòu)造器,而提供了兩個(gè)靜態(tài)方法來(lái)獲取InetAddress實(shí)例

getByName(String host):根據(jù)主機(jī)獲取對(duì)應(yīng)的InetAddress對(duì)象

getByAddress(byte[] addr):根據(jù)原始IP地址來(lái)獲取對(duì)應(yīng)的InetAddress對(duì)象

InetAddress還提供了如下三個(gè)方法來(lái)獲取InetAddress實(shí)例對(duì)應(yīng)的IP地址和主機(jī)名:

String getCanonicalHostName():獲取此IP地址的全限定域名

String getHostAddress():返回該InetAddress實(shí)例對(duì)應(yīng)的IP地址字符串(以字符串形式)

String getHostName():獲取此IP地址的主機(jī)名

InetAddress類(lèi)還提供了一個(gè)getLocalHost()方法來(lái)獲取本機(jī)IP地址對(duì)應(yīng)的InetAddress實(shí)例

InetAddress類(lèi)還提供了一個(gè)isReachable()方法,用于測(cè)試是否可以到達(dá)該地址,該方法將盡最大努力試圖到達(dá)主機(jī)

import java.net.*;

public class InetAddressTest
{
    public static void main(String[] args)
        throws Exception
    {
        // 根據(jù)主機(jī)名來(lái)獲取對(duì)應(yīng)的InetAddress實(shí)例
        InetAddress ip = InetAddress.getByName("http://www.google.com/");
        // 判斷是否可達(dá)
        System.out.println("google是否可達(dá):" + ip.isReachable(2000));
        // 獲取該InetAddress實(shí)例的IP字符串
        System.out.println(ip.getHostAddress());
        // 根據(jù)原始IP地址來(lái)獲取對(duì)應(yīng)的InetAddress實(shí)例
        InetAddress local = InetAddress.getByAddress(
            new byte[]{127,0,0,1});
        System.out.println("本機(jī)是否可達(dá):" + local.isReachable(5000));
        // 獲取該InetAddress實(shí)例對(duì)應(yīng)的全限定域名
        System.out.println(local.getCanonicalHostName());
    }
}
使用URLDecoder和URLEncoder

URLDecoder和URLEncoder用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之間的相互轉(zhuǎn)換

編程過(guò)程中可能涉及普通字符串和這種特殊字符串的相關(guān)轉(zhuǎn)換,這就需要使用URLDecoder類(lèi)和URLEncoder類(lèi)

URLDecoder類(lèi)包含一個(gè)decoder(String s, String enc)靜態(tài)方法,它可以將看上去亂碼的特殊字符串轉(zhuǎn)換成普通字符串

URLEncoder類(lèi)包含一個(gè)encoder(String s, String enc)靜態(tài)方法,它可以將普通字符串轉(zhuǎn)換為application/x-www-form-urlencoded MIME字符串

import java.net.*;

public class URLDecoderTest
{
    public static void main(String[] args)
        throws Exception
    {
        // 將application/x-www-form-urlencoded字符串
        // 轉(zhuǎn)換成普通字符串
        String keyWord = URLDecoder.decode(
            "%E6%B5%B7%E8%B4%BC%E7%8E%8B", "utf-8");
        System.out.println(keyWord);
        // 將普通字符串轉(zhuǎn)換成
        // application/x-www-form-urlencoded字符串
        String urlStr = URLEncoder.encode(
            "海賊王" , "GBK");
        System.out.println(urlStr);
    }
}
URL、URLConnection和URLPermission

URL(Uniform Resource Locator)對(duì)象代表統(tǒng)一資源定位器,是指向互聯(lián)網(wǎng)“資源”的指針。資源可以是簡(jiǎn)單的文件或目錄,也可以是對(duì)更復(fù)雜的對(duì)象的引用,例如對(duì)數(shù)據(jù)庫(kù)或搜索引擎的查詢(xún)

URL可以由協(xié)議名、主機(jī)、端口和資源組成,既滿(mǎn)足如下格式:

protocal://host:port/resourceName

例如如下的URL地址:

http://china.nba.com/teamindex/

String getFile():獲取此LRL的資源名

String getHost():獲取此URL的主機(jī)名

String getPath():獲取此URL的路徑部分

int getPort():獲取此URL的端口號(hào)

String getProtocal():獲取此URL的協(xié)議名稱(chēng)

String getQuery():獲取此URL的查詢(xún)字符串部分

URLConnecton openConnection():返回一個(gè)URLConnection對(duì)象,它表示到URL所引用的遠(yuǎn)程對(duì)象的連接

InoutStream openStream():打開(kāi)與此URL的連接,并返回一個(gè)用于讀取該URL資源的InputStream

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.*;

public class DownUtil
{
    // 定義下載資源的路徑
    private String path;
    // 指定所下載的文件的保存位置
    private String targetFile;
    // 定義需要使用多少線程下載資源
    private int threadNum;
    // 定義下載的線程對(duì)象
    private DownThread[] threads;
    // 定義下載的文件的總大小
    private int fileSize;

    public DownUtil(String path, String targetFile, int threadNum)
    {
        this.path = path;
        this.threadNum = threadNum;
        // 初始化threads數(shù)組
        threads = new DownThread[threadNum];
        this.targetFile = targetFile;
    }

    public void download() throws Exception
    {
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5 * 1000);
        conn.setRequestMethod("GET");
        conn.setRequestProperty(
            "Accept",
            "image/gif, image/jpeg, image/pjpeg, image/pjpeg, "
            + "application/x-shockwave-flash, application/xaml+xml, "
            + "application/vnd.ms-xpsdocument, application/x-ms-xbap, "
            + "application/x-ms-application, application/vnd.ms-excel, "
            + "application/vnd.ms-powerpoint, application/msword, */*");
        conn.setRequestProperty("Accept-Language", "zh-CN");
        conn.setRequestProperty("Charset", "UTF-8");
        conn.setRequestProperty("Connection", "Keep-Alive");
        // 得到文件大小
        fileSize = conn.getContentLength();
        conn.disconnect();
        int currentPartSize = fileSize / threadNum + 1;
        RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
        // 設(shè)置本地文件的大小
        file.setLength(fileSize);
        file.close();
        for (int i = 0; i < threadNum; i++)
        {
            // 計(jì)算每條線程的下載的開(kāi)始位置
            int startPos = i * currentPartSize;
            // 每個(gè)線程使用一個(gè)RandomAccessFile進(jìn)行下載
            RandomAccessFile currentPart = new RandomAccessFile(targetFile,
                "rw");
            // 定位該線程的下載位置
            currentPart.seek(startPos);
            // 創(chuàng)建下載線程
            threads[i] = new DownThread(startPos, currentPartSize,
                currentPart);
            // 啟動(dòng)下載線程
            threads[i].start();
        }
    }

    // 獲取下載的完成百分比
    public double getCompleteRate()
    {
        // 統(tǒng)計(jì)多條線程已經(jīng)下載的總大小
        int sumSize = 0;
        for (int i = 0; i < threadNum; i++)
        {
            sumSize += threads[i].length;
        }
        // 返回已經(jīng)完成的百分比
        return sumSize * 1.0 / fileSize;
    }

    private class DownThread extends Thread
    {
        // 當(dāng)前線程的下載位置
        private int startPos;
        // 定義當(dāng)前線程負(fù)責(zé)下載的文件大小
        private int currentPartSize;
        // 當(dāng)前線程需要下載的文件塊
        private RandomAccessFile currentPart;
        // 定義已經(jīng)該線程已下載的字節(jié)數(shù)
        public int length;

        public DownThread(int startPos, int currentPartSize,
            RandomAccessFile currentPart)
        {
            this.startPos = startPos;
            this.currentPartSize = currentPartSize;
            this.currentPart = currentPart;
        }

        @Override
        public void run()
        {
            try
            {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection)url
                    .openConnection();
                conn.setConnectTimeout(5 * 1000);
                conn.setRequestMethod("GET");
                conn.setRequestProperty(
                    "Accept",
                    "image/gif, image/jpeg, image/pjpeg, image/pjpeg, "
                    + "application/x-shockwave-flash, application/xaml+xml, "
                    + "application/vnd.ms-xpsdocument, application/x-ms-xbap, "
                    + "application/x-ms-application, application/vnd.ms-excel, "
                    + "application/vnd.ms-powerpoint, application/msword, */*");
                conn.setRequestProperty("Accept-Language", "zh-CN");
                conn.setRequestProperty("Charset", "UTF-8");
                InputStream inStream = conn.getInputStream();
                // 跳過(guò)startPos個(gè)字節(jié),表明該線程只下載自己負(fù)責(zé)哪部分文件。
                inStream.skip(this.startPos);
                byte[] buffer = new byte[1024];
                int hasRead = 0;
                // 讀取網(wǎng)絡(luò)數(shù)據(jù),并寫(xiě)入本地文件
                while (length < currentPartSize
                    && (hasRead = inStream.read(buffer)) != -1)
                {
                    currentPart.write(buffer, 0, hasRead);
                    // 累計(jì)該線程下載的總大小
                    length += hasRead;
                }
                currentPart.close();
                inStream.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

DownUtils類(lèi)的download()方法負(fù)責(zé)如下步驟實(shí)現(xiàn)多線程下載:

創(chuàng)建URL對(duì)象

獲取指定URL對(duì)象所指向資源的大小(通過(guò)getContentLength()方法獲得);URLConnection類(lèi)代表Java應(yīng)用程序和URL之間的通信連接

在本地磁盤(pán)上創(chuàng)建一個(gè)與網(wǎng)絡(luò)資源具有相同大小的空文件

計(jì)算每個(gè)線程應(yīng)該下載網(wǎng)絡(luò)資源的哪個(gè)部分

依次創(chuàng)建、啟動(dòng)多個(gè)線程來(lái)下載網(wǎng)絡(luò)資源的指定部分

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66745.html

相關(guān)文章

  • Java編程在現(xiàn)代的發(fā)展空間

    摘要:編程是目前最普遍的開(kāi)發(fā)平臺(tái),也是目前最主流的計(jì)算機(jī)技術(shù),編程以高效跨平臺(tái)而著稱(chēng),應(yīng)用于網(wǎng)站移動(dòng)開(kāi)發(fā)平臺(tái)數(shù)據(jù)中心等領(lǐng)域。編程正在改變著全世界的生活。   Java編程是目前最普遍的開(kāi)發(fā)平臺(tái),也是目前最主流的計(jì)算機(jī)技術(shù),Java編程以高效、跨平臺(tái)而著稱(chēng),應(yīng)用于網(wǎng)站、移動(dòng)開(kāi)發(fā)平臺(tái)、數(shù)據(jù)中心等領(lǐng)域??偲饋?lái)說(shuō)Java編程是一種可以撰寫(xiě)跨平臺(tái)應(yīng)用軟件的面相對(duì)象的程序設(shè)計(jì)語(yǔ)言,尤其是在互聯(lián)網(wǎng)高速發(fā)展...

    LeexMuller 評(píng)論0 收藏0
  • 11個(gè)最值得Java開(kāi)發(fā)者收藏的網(wǎng)站

    摘要:是領(lǐng)域最具代表性的問(wèn)答網(wǎng)站之一。在,開(kāi)發(fā)者能夠?yàn)楦鞣N相關(guān)的開(kāi)源代碼貢獻(xiàn)自己的力量,也可以發(fā)布軟件開(kāi)發(fā)項(xiàng)目。該網(wǎng)站發(fā)布各技術(shù)領(lǐng)域的高技術(shù)含量?jī)?nèi)容,例如大數(shù)據(jù),云計(jì)算,,物聯(lián)網(wǎng),開(kāi)發(fā)等。是一個(gè)大型的資源類(lèi)網(wǎng)站,主要涉及源代碼和代碼示例。 Java是一種面向?qū)ο蟮木幊陶Z(yǔ)言,由Sun Microsystems公司在1995年的時(shí)候正式發(fā)布。直到今天,Java都一直是最受歡迎的編程語(yǔ)言之一。如今...

    WrBug 評(píng)論0 收藏0
  • Java? 教程(Java技術(shù)現(xiàn)象)

    Java技術(shù)現(xiàn)象 關(guān)于Java技術(shù)的討論似乎無(wú)處不在,但究竟是什么呢?下面幾節(jié)將解釋Java技術(shù)如何既是一種編程語(yǔ)言又是一種平臺(tái),并概述該技術(shù)可以為你做什么。 關(guān)于Java技術(shù) Java技術(shù)既是編程語(yǔ)言又是平臺(tái)。 Java編程語(yǔ)言 Java編程語(yǔ)言是一種高級(jí)語(yǔ)言,可以用以下所有流行語(yǔ)來(lái)描述它: 簡(jiǎn)單的 體系結(jié)構(gòu)中立的 面向?qū)ο蟮?輕便的 分布式的 高性能的 多線程 健壯的 動(dòng)態(tài)的 安全的 前面...

    haobowd 評(píng)論0 收藏0
  • Java 8函數(shù)式編程》作者Richard Warbourton:Java的亮點(diǎn)不是語(yǔ)言本身

    摘要:根據(jù)對(duì)社區(qū)和新特性的深刻理解,他創(chuàng)作了函數(shù)式編程一書(shū)。問(wèn)你在倫敦社區(qū)的經(jīng)歷是否幫助你創(chuàng)作了函數(shù)式編程這本書(shū)絕對(duì)是這樣。我認(rèn)為引入函數(shù)式編程會(huì)為很多編程任務(wù)提供方便。問(wèn)之前的是面向?qū)ο蟮?,現(xiàn)在全面支持函數(shù)式編程。 非商業(yè)轉(zhuǎn)載請(qǐng)注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/199271 Richard Warburto...

    mzlogin 評(píng)論0 收藏0
  • 學(xué)習(xí)Java必讀的10本書(shū)籍

    摘要:學(xué)習(xí)編程的本最佳書(shū)籍這些書(shū)涵蓋了各個(gè)領(lǐng)域,包括核心基礎(chǔ)知識(shí),集合框架,多線程和并發(fā),內(nèi)部和性能調(diào)優(yōu),設(shè)計(jì)模式等。擅長(zhǎng)解釋錯(cuò)誤及錯(cuò)誤的原因以及如何解決簡(jiǎn)而言之,這是學(xué)習(xí)中并發(fā)和多線程的最佳書(shū)籍之一。 showImg(https://segmentfault.com/img/remote/1460000018913016); 來(lái)源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slo...

    masturbator 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<