真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Go36-47-基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)(net/http)-創(chuàng)新互聯(lián)

基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)

HTTP協(xié)議是基于TCP/IP協(xié)議棧的,并且是一個面向普通文本的協(xié)議。原則上,使用任何一個文本編輯器,都可以寫出一個完整的HTTP請求報(bào)文。只要搞清楚了請求報(bào)文的頭部(header、請求頭)和主體(body、請求體)應(yīng)該包含的內(nèi)容。
如果只是訪問基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù),那么使用net/http包中的程序?qū)嶓w會非常方便。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了阿瓦提免費(fèi)建站歡迎大家使用!

http.Get函數(shù)

調(diào)用http.Get函數(shù),只需要傳遞給它一個URL即可:

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    resp, err := http.Get("http://baidu.com")
    if err != nil {
        fmt.Fprintf(os.Stderr, "request sending error: %v\n", err)
        return
    }
    defer resp.Body.Close()
    line := resp.Proto + " " + resp.Status
    fmt.Println("返回的第一行的內(nèi)容:", line)
}

http.Get函數(shù)會返回兩個結(jié)果:

  • (resp *Response): 網(wǎng)絡(luò)服務(wù)返回的響應(yīng)內(nèi)容的結(jié)構(gòu)化表示
  • (err error): 創(chuàng)建和發(fā)送HTTP請求,以及接收和解析HTTP響應(yīng)的過程中可能發(fā)生的錯誤

http.Get函數(shù)會在內(nèi)部使用缺省的HTTP客戶端,并且調(diào)用它的Get方法來完成功能。這個缺省的HTTP客戶端就是net/http包中的公開變量DefaultClient,源碼中是這樣的:

// 源碼中提供的缺省的客戶端
var DefaultClient = &Client{}

// 使用缺省的客戶端調(diào)用Get方法
func Get(url string) () {
    return DefaultClient.Get(url)
}

所以下面的這兩行代碼:

var httpClient http.Client
resp, err := httpClient.Get(utl)

與示例中的這一行代碼:

resp, err := http.Get(url)

是等價(jià)的。這里只是不使用DefaultClient而是自己創(chuàng)建了一個客戶端。

http.Client類型

http.Client是一個結(jié)構(gòu)體,并且它包含的字段都是公開的:

type Client struct {
    Transport RoundTripper
    CheckRedirect func(req *Request, via []*Request) error
    Jar CookieJar
    Timeout time.Duration
}

該類型是開箱即用的,因?yàn)樗乃凶侄?,要么存在相?yīng)的缺省值,要么其零值直接就可以使用,并且代表著特定的含義。

Transport字段

主要看下Transport字段,該字段向網(wǎng)絡(luò)服務(wù)發(fā)送HTTP請求,并從網(wǎng)絡(luò)服務(wù)接收HTTP響應(yīng)。該字段的方法RoundTrip應(yīng)該實(shí)現(xiàn)單次HTTP事務(wù)(或者說基于HTTP協(xié)議的單次交互)需要的所有步驟。這個字段是一個接口:

type RoundTripper interface {
    RoundTrip(*Request) (*Response, error)
}

并且該字段有一個由http.DefaultTransport變量的缺省值:

func (c *Client) transport() RoundTripper {
    if c.Transport != nil {
        return c.Transport
    }
    return DefaultTransport
}

在初始化http.Client類型的時候,如果沒有顯式的為該字段賦值,這個Client字段就會直接使用DefaultTransport。

Timeout字段

該字段是單次HTTP事務(wù)的超時時間,它是time.Duration類型。它的零值是可用的,用于表示沒有設(shè)置超時時間。

http.Transport類型

http.Transport類型是一個結(jié)構(gòu)體,該類型包含的字段很多。這里通過http.Client結(jié)構(gòu)體中的Transport字段的缺省值DefaultTransport,來深入了解一下。DefaultTransport是一個*http.Transport的結(jié)構(gòu)體,做了一些默認(rèn)的設(shè)置:

var DefaultTransport RoundTripper = &Transport{
    Proxy: ProxyFromEnvironment,
    DialContext: (&net.Dialer{
        Timeout:   30 * time.Second,
        KeepAlive: 30 * time.Second,
        DualStack: true,
    }).DialContext,
    MaxIdleConns:          100,
    IdleConnTimeout:       90 * time.Second,
    TLSHandshakeTimeout:   10 * time.Second,
    ExpectContinueTimeout: 1 * time.Second,
}

這里Transport結(jié)構(gòu)體的指針就是就是RoundTripper接口的默認(rèn)實(shí)現(xiàn):

func (t *Transport) RoundTrip(req *Request) (*Response, error) {
    return t.roundTrip(req)
}

這個類型是可以被復(fù)用的,并且也推薦被復(fù)用。同時它也是并發(fā)安全的。所以http.Client類型也是一樣,推薦復(fù)用,并且并發(fā)安全。
看上面的默認(rèn)設(shè)置,http.Transport類型,內(nèi)部的DialContext字段會使用net.Dialer類型的值,并且把Timeout設(shè)置為30秒。仔細(xì)看,該值是一個方法,這里把Dialer值的DialContext方法賦值給了DefaultTransport里的同名字段,并且已經(jīng)設(shè)置好了調(diào)用該方法時的結(jié)構(gòu)體。

操作超時相關(guān)字段

http.Transport類型還包含了很多其他的字段,其中有一些字段是關(guān)于操作超時的:

  • IdleConnTimeout: 空閑的連接在多久之后就應(yīng)該被關(guān)閉。DefaultTransport把該值設(shè)置為90秒。如果是0,表示不關(guān)閉空閑的連接,注意,這樣很可能會造成資源的泄露。
  • ResponseHeaderTimeout: 從客戶端把請求完全遞交給操作系統(tǒng)到從操作系統(tǒng)那里接收到響應(yīng)報(bào)文的最長時長。DefaultTransport沒有設(shè)定該字段的值。
  • ExpectContinueTimeout: 在客戶端遞交了請求報(bào)文頭之后,等待接收第一個響應(yīng)報(bào)文頭的最長時間。在客戶端想要使用POST發(fā)送一個很大的請求給服務(wù)端的時候,可以通過發(fā)送一個包含了“Expect: 100-continue”的請求頭,來詢問服務(wù)端是否愿意接收這個大請求體。這個字段就是用于設(shè)定在這種情況下的超時時間的。如果該字段的值不大于0,那么就不詢問了,直接把請求體一并發(fā)出,無論多大。這樣可能會造成網(wǎng)絡(luò)資源的浪費(fèi)。DefaultTransport把該值設(shè)置為1秒。
  • TLSHandshakeTimeout: 表示基于TLS協(xié)議的連接在被建立時的握手階段的超時時間。如果是0,則表示沒有超時限制。DefaultTransport把該值設(shè)置為10秒。

TLS 是 Transport Layer Security 的縮寫,可以被翻譯為傳輸層安全。

連接數(shù)限制相關(guān)字段

此外,還有一些與IdleConnTimeout相關(guān)的字段值也值得關(guān)注:

  • MaxIdleConns
  • MaxIdleConnsPerHost
  • MaxConnsPerHost

MaxIdleConns
無論當(dāng)前訪問了多少個網(wǎng)絡(luò)服務(wù),MaxIdleConns字段只會對空閑連接的總數(shù)做限定。

MaxIdleConnsPerHost
而MaxIdleConnsPerHost字段限定的是,每一個網(wǎng)絡(luò)服務(wù)的大空閑連接數(shù)。每一個網(wǎng)絡(luò)服務(wù)都有自己的網(wǎng)絡(luò)地址,可能會使用不同的網(wǎng)絡(luò)協(xié)議,對于一些HTTP請求也可能會用到代理。地址、協(xié)議、代理,通脫這三個方面的具體情況來鑒別不同的網(wǎng)絡(luò)服務(wù)。
MaxIdleConnsPerHost是有缺省值的,由常量http.DefaultMaxIdleConnsPerHost表示,值為2:

const DefaultMaxIdleConnsPerHost = 2

func (t *Transport) maxIdleConnsPerHost() int {
    if v := t.MaxIdleConnsPerHost; v != 0 {
        return v
    }
    return DefaultMaxIdleConnsPerHost
}

在默認(rèn)情況下,每一個網(wǎng)絡(luò)服務(wù),它的空閑連接數(shù)最多只能由2個。

MaxConnsPerHost
MaxConnsPerHost字段限制針對每一個網(wǎng)絡(luò)服務(wù)的大連接數(shù),不論這些鏈接是否是空閑的。并且,該字段沒有相應(yīng)的缺省值,零值就是不做限制。

小結(jié)
不限制連接數(shù),默認(rèn)也不限制每一個網(wǎng)絡(luò)服務(wù)的連接數(shù)。要限制整體的空閑連接數(shù)以及嚴(yán)格限制對每一個網(wǎng)絡(luò)服務(wù)的空閑連接數(shù)。

空閑的連接

簡單說明一下,為什么會出現(xiàn)空閑的連接。
HTTP協(xié)議的請求頭里有一個Connection。在HTTP協(xié)議的1.1版本中,默認(rèn)值是“keep-alive”。在這種情況下的網(wǎng)絡(luò)連接是持久連接的,它們會在當(dāng)前的HTTP事務(wù)完成后仍然保持著連通性,因此是可以被復(fù)用的。
既然連接可以被復(fù)用,就會有兩種可能:

  1. 針對同一個網(wǎng)絡(luò)服務(wù),有新的HTTP請求被提交,該連接被再次使用。
  2. 不再對該網(wǎng)絡(luò)服務(wù)提交HTTP請求,該連接被閑置。這樣就產(chǎn)生了空閑的連接。

另外,如果分配給某一個網(wǎng)絡(luò)服務(wù)的連接過多的話,也可能會導(dǎo)致空閑連接的產(chǎn)生。因?yàn)闆]一個HTTP請求只會使用一個空閑的連接。所以,在大多數(shù)情況下,都需要限制空閑連接數(shù)。

關(guān)閉keep-alive
另外,請求頭的Connection還可以設(shè)置為“close”,這樣就徹徹底杜絕了空閑連接的生成。這會告訴網(wǎng)絡(luò)服務(wù),這個網(wǎng)絡(luò)連接不必保持,當(dāng)前的HTTP事務(wù)完成后就可以斷開它了。做法是在初始化Transport值的時候,將DisableKeepAlives字段設(shè)置為true。
這么做的話,每次提交HTTP請求,就會產(chǎn)生一個新的網(wǎng)絡(luò)連接。這樣會明顯的加重網(wǎng)絡(luò)服務(wù)以及客戶端的負(fù)載,并會讓每個HTTP事務(wù)都耗費(fèi)更多的時間。所以默認(rèn)不設(shè)置這個DisableKeepAlives字段。

net.Dialer類型

http.Transport類型,內(nèi)部的DialContext字段會使用net.Dialer類型的值。在net.Dialer類型中,也有一個KeepAlive字段。該字段是直接作用在底層的socket上的。
它的背后是一種針對網(wǎng)絡(luò)連接(更確切的是說,是TCP連接)的存活探測機(jī)制。它的值用于表示每間隔多長時間發(fā)送一次探測包。當(dāng)該值不大于0是,則表示不開啟這種機(jī)制。
DefaultTransport會把這個字段設(shè)置為30秒。

Client示例

自定義Client和Transport使用的示例:

package main

import (
    "fmt"
    "io/ioutil"
    "net"
    "net/http"
    "strings"
    "sync"
    "time"
)

var domains = []string{
    "baidu.com",
    "sina.com.cn",
    "www.baidu.com",
    "www.sina.com.cn",
    "tieba.baidu.com",
    "news.baidu.com",
    "news.sina.com.cn",
}

func main() {
    myTransport := &http.Transport{
        Proxy: http.ProxyFromEnvironment,
        DialContext: (&net.Dialer{
            Timeout:   15 * time.Second,
            KeepAlive: 15 * time.Second,
            DualStack: true,
        }).DialContext,
        MaxConnsPerHost:       2,
        MaxIdleConns:          10,
        MaxIdleConnsPerHost:   2,
        IdleConnTimeout:       30 * time.Second,
        ResponseHeaderTimeout: 0,
        ExpectContinueTimeout: 1 * time.Second,
        TLSHandshakeTimeout:   10 * time.Second,
    }
    myClient := http.Client{
        Transport: myTransport,
        Timeout:   20 * time.Second,
    }

    var wg sync.WaitGroup
    for _, domain := range domains {
        wg.Add(1)
        go func(domain string) {
            var logBuf strings.Builder
            var diff time.Duration
            defer func() {
                logBuf.WriteString(fmt.Sprintf("持續(xù)時間: %s\n", diff))
                fmt.Println(logBuf.String())
                wg.Done()
            }()
            url := "https://" + domain
            logBuf.WriteString(fmt.Sprintf("發(fā)送請求: %s\n", url))
            tStart := time.Now()
            resp, err := myClient.Get(url)
            diff = time.Now().Sub(tStart)
            if err != nil {
                logBuf.WriteString(fmt.Sprintf("request get error: %v\n", err))
                return
            }
            defer resp.Body.Close()
            line := resp.Proto + " " + resp.Status
            logBuf.WriteString(fmt.Sprintf("response: %s\n", line))

            data, err := ioutil.ReadAll(resp.Body)
            if err != nil {
                logBuf.WriteString(fmt.Sprintf("get data error: %v\n", err))
                return
            }
            index1 := strings.Index(string(data), "")
            index2 := strings.Index(string(data), "")
            if index1 > 0 && index2 > 0 {
                logBuf.WriteString(fmt.Sprintf("title: %s\n", string(data)[index1+len(""):index2]))
            }
        }(domain)
    }
    wg.Wait()
    fmt.Println("All Done")
}</code></pre><h2>http.Server類型</h2><p>http.Server類型與http.Client是相對應(yīng)的。http.Server代表的是基于HTTP協(xié)議的服務(wù)端,或者說網(wǎng)絡(luò)服務(wù)。</p><h3>ListenAndServe方法</h3><p>http.Server類型的ListenAndServe方法的功能是:監(jiān)聽一個基于TCP協(xié)議的網(wǎng)絡(luò)地址,并對接收到的HTTP請求進(jìn)行處理。這個方法會默認(rèn)開啟針對網(wǎng)絡(luò)連接的存活探測機(jī)制,以保證連接是持久的。同時,該方法會一直執(zhí)行,直到有嚴(yán)重的錯誤發(fā)生或者被外界關(guān)掉。當(dāng)被外界關(guān)掉時,它會返回一個由http.ErrServerClosed變量代表的錯誤值。<br/>這個ListenAndServe方法主要會做以下幾件事情:</p><ol><li>檢查當(dāng)前的http.Server類型的值的Addr字段。Addr是當(dāng)前的網(wǎng)絡(luò)服務(wù)需要使用的網(wǎng)絡(luò)地址,即:IP地址和端口號。如果這個字段的值為空字符串,那么就用":http"代替。也就是說,使用任何可以代表本機(jī)的域名和IP地址,并且端口號為80。</li><li>通過調(diào)用net.Listen函數(shù)在已確定的網(wǎng)絡(luò)地址上啟動基于TCP協(xié)議的監(jiān)聽。</li><li>檢查net.Listen函數(shù)返回的錯誤值。如果該錯誤值不為nil,那么就直接返回該錯誤值。否則,通過調(diào)用當(dāng)前http.Server值的Serve方法準(zhǔn)備接受和處理將要到來的HTP請求。</li></ol><p>這里又牽出兩個問題:</p><ol><li>net.Listen函數(shù)</li><li>http.Server類型的Serve方法</li></ol><h3>net.Listen函數(shù)</h3><p>net.Listen函數(shù)的作用:</p><ul><li>解析參數(shù)值中包含的網(wǎng)絡(luò)地址隱含的IP地址和端口號</li><li>根據(jù)給定的網(wǎng)絡(luò)協(xié)議,確定監(jiān)聽的方法,并開始進(jìn)行監(jiān)聽</li></ul><p>再往下深入的話,就會涉及到net.socket函數(shù)以及相關(guān)的socket知識。就此打住。</p><h3>http.Server類型的Serve方法</h3><p>在一個for循環(huán)中,網(wǎng)絡(luò)監(jiān)聽器Accept方法會不斷地調(diào)用,該方法的源碼如下:</p><pre><code>type tcpKeepAliveListener struct {
    *net.TCPListener
}

func (ln tcpKeepAliveListener) Accept() (net.Conn, error) {
    tc, err := ln.AcceptTCP()
    if err != nil {
        return nil, err
    }
    tc.SetKeepAlive(true)
    tc.SetKeepAlivePeriod(3 * time.Minute)
    return tc, nil
}</code></pre><p>Accept方法會返回兩個結(jié)果值:</p><ul><li>net.Conn : 代表包含了新到來的HTTP請求的網(wǎng)絡(luò)連接</li><li>error : 代表了可能發(fā)生的錯誤的error的類型值</li></ul><p>當(dāng)錯誤值不為nil時,如果此時是一個暫時性的錯誤,那么循環(huán)的下一次迭代將會在一段時間之后開始執(zhí)行。否則,循環(huán)會被終止。<br/>如果沒有錯誤,返回的錯誤值就是nil。那么這里的程序?qū)阉牡谝粋€結(jié)果值包裝成一個*http.conn類型的值,然后通過在新的goroutine中調(diào)用這個conn值的serve方法,來對當(dāng)前的HTTP請求進(jìn)行處理。</p><p>上面最后說的處理的細(xì)節(jié)還是很多的:</p><ul><li>conn值的各種狀態(tài),各狀態(tài)代表的處理階段</li><li>處理過程中會用到的讀取器和寫入器,及其作用</li><li>讓程序調(diào)用自定義的處理函數(shù)</li></ul><p>這些都沒有一一說明,建議去看下源碼。</p><h3>Server示例</h3><p>在下面的示例中,啟動了3個Server。啟動后,可以用瀏覽器訪問進(jìn)行驗(yàn)證:</p><pre><code>package main

import (
    "fmt"
    "net/http"
    "os"
    "sync"
)

var wg sync.WaitGroup

// 一般沒有這么用的,http.Server的Handler字段
// 要么是nil,就用包里的http.DefaultServeMux
// 要么用NewServeMux()來創(chuàng)建一個*http.ServeMux
// 我這里按照http.Handler接口的要求實(shí)現(xiàn)了一個,賦值給Handler字段
// 這個自定義的Handler不支持路由
func startServer1() {
    defer wg.Done()
    var httpServer http.Server
    httpServer.Addr = "127.0.0.1:8001"
    httpServer.Handler = http.HandlerFunc(
        func(w http.ResponseWriter, r *http.Request) {
            fmt.Println(*r)
            fmt.Fprint(w, "Hello World")
        },
    )
    fmt.Println("啟動服務(wù),訪問: http://127.0.0.1:8001")
    if err := httpServer.ListenAndServe(); err != nil {
        if err == http.ErrServerClosed {
            fmt.Println("HTTP Server1 Closed.")
        } else {
            fmt.Fprintf(os.Stderr, "HTTP Server1 Error: %v\n", err)
        }
    }
}

// 這個最簡單,都是調(diào)用http包里的函數(shù)。本質(zhì)上還是要調(diào)用方法的,都會用默認(rèn)的或是零值
func startServer2() {
    defer wg.Done()
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello World\nThis is Server2")
    })
    fmt.Println("啟動服務(wù),訪問: http://127.0.0.1:8002")
    // 第二個參數(shù)傳nil,就是用包里的http.DefaultServeMux,或者也可以自己創(chuàng)建一個傳給第二個參數(shù)
    if err := http.ListenAndServe("127.0.0.1:8002", nil); err != nil {
        if err == http.ErrServerClosed {
            fmt.Println("HTTP Server2 Closed.")
        } else {
            fmt.Fprintf(os.Stderr, "HTTP Server2 Error: %v\n", err)
        }
    }
}

// 這個例子里用到了解析Get請求的參數(shù),并且還設(shè)置了2個路由
func startServer3() {
    defer wg.Done()
    mux := http.NewServeMux()
    mux.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path != "/hi" {
            // 這個分支應(yīng)該是進(jìn)不來的,因?yàn)橐M(jìn)入這個分支,路徑應(yīng)該必須是"/hi"
            fmt.Println("Server3 hi 404")
            http.NotFound(w, r)
            return
        }
        name := r.FormValue("name")
        if name == "" {
            fmt.Fprint(w, "Hi!")
        } else {
            fmt.Fprintf(w, "Hi, %s!", name)
        }
    })
    mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello World\nThis is Server3")
    })
    // 如果只是定義http.Server的下面2個字段,完全可以使用http.ListenAndServe函數(shù)來啟動服務(wù)
    // 這樣的用法可以對http.Server里更多的字段進(jìn)行自定義
    httpServer := http.Server{
        Addr: "127.0.0.1:8003",
        Handler: mux,
    }
    fmt.Println("啟動服務(wù),訪問: http://127.0.0.1:8003/hi?name=Adam")
    if err := httpServer.ListenAndServe(); err != nil {
        if err == http.ErrServerClosed {
            fmt.Println("HTTP Server3 Closed.")
        } else {
            fmt.Fprintf(os.Stderr, "HTTP Server3 Error: %v\n", err)
        }
    }
}

func main() {
    wg.Add(1)
    go startServer1()
    wg.Add(1)
    go startServer2()
    wg.Add(1)
    go startServer3()
    wg.Wait()
}</code></pre><h3>補(bǔ)充-優(yōu)雅的停止HTTP服務(wù)</h3><p>包里還提供了一個Shutdown方法,可以優(yōu)雅的停止HTTP服務(wù):</p><pre><code>func (srv *Server) Shutdown(ctx context.Context) error {
    // 內(nèi)容省略
}</code></pre><p>我們要做的就是在需要的時候,可以調(diào)用該Shutdown方法。<br/>這里的問題是,調(diào)用了ListenAndServe方法之后,就進(jìn)入了無限循環(huán)的流程。這里最好是用一個goroutine來啟動ListenAndServe方法,在goroutine外聲明http.Server。然后在主線程里等待一個信號,比如是從通道接收值。這樣就可以在主線程里調(diào)用這個Shutdown方法執(zhí)行了。</p><p>創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。</p>            <br>
            網(wǎng)站標(biāo)題:Go36-47-基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)(net/http)-創(chuàng)新互聯(lián)            <br>
            文章源于:<a href="http://weahome.cn/article/depcgj.html">http://weahome.cn/article/depcgj.html</a>
        </div>
    </div>
</div>
<div   id="squ6kqw"   class="other container">
    <h3>其他資訊</h3>
    <ul>
        <li>
                <a href="/article/dphdoc.html">Linux基礎(chǔ)命令paste的使用方法-創(chuàng)新互聯(lián)</a>
            </li><li>
                <a href="/article/dphdgo.html">怎么用python檢查函數(shù)參數(shù)是否合格-創(chuàng)新互聯(lián)</a>
            </li><li>
                <a href="/article/dphdec.html">C++對象繼承中內(nèi)存布局的示例分析-創(chuàng)新互聯(lián)</a>
            </li><li>
                <a href="/article/dphdie.html">Linux下實(shí)現(xiàn)Mysql定時任務(wù)的案例-創(chuàng)新互聯(lián)</a>
            </li><li>
                <a href="/article/dphdij.html">Python實(shí)現(xiàn)釘釘訂閱消息功能-創(chuàng)新互聯(lián)</a>
            </li>    </ul>
</div>
<div   id="squ6kqw"   class="footer">
    <div   id="squ6kqw"   class="foota container">
        <div   id="squ6kqw"   class="foot_nav fl col-lg-8 col-md-8 col-sm-12 col-xs-12">
            <ul>
                <li id="squ6kqw"    class="col-lg-3 col-md-3 col-sm-3 col-xs-6">
                    <h3>網(wǎng)站制作</h3>
                    <a  target="_blank">網(wǎng)站制作</a><a  target="_blank">手機(jī)網(wǎng)站制作</a><a  target="_blank">達(dá)州網(wǎng)站制作</a><a  target="_blank">手機(jī)網(wǎng)站制作</a><a  target="_blank">四川成都網(wǎng)站制作</a><a  target="_blank">綿陽網(wǎng)站制作公司</a>                </li>
                <li id="squ6kqw"    class="col-lg-3 col-md-3 col-sm-3 col-xs-6">
                    <h3>企業(yè)服務(wù)</h3>
                    <a  target="_blank">廣播電視節(jié)目制作許可證</a><a  target="_blank">食品經(jīng)營許可證</a><a  target="_blank">鏈接買賣</a><a  target="_blank">400電話</a><a  target="_blank">分類目錄</a><a  target="_blank">網(wǎng)絡(luò)文化經(jīng)營許可證</a>                </li>
                <li id="squ6kqw"    class="col-lg-3 col-md-3 col-sm-3 col-xs-6">
                    <h3>網(wǎng)站建設(shè)</h3>
                    <a  target="_blank">成都網(wǎng)站建設(shè)</a><a  target="_blank">成都外貿(mào)網(wǎng)站建設(shè)公司</a><a  target="_blank">溫江網(wǎng)站建設(shè)</a><a  target="_blank">成都網(wǎng)站建設(shè)公司</a><a  target="_blank">成都網(wǎng)站建設(shè)</a><a  target="_blank">手機(jī)網(wǎng)站建設(shè)</a>                </li>
                <li id="squ6kqw"    class="col-lg-3 col-md-3 col-sm-3 col-xs-6">
                    <h3>服務(wù)器托管</h3>
                    <a  target="_blank">綿陽托管服務(wù)器</a><a  target="_blank">綿陽主機(jī)托管</a><a  target="_blank">成都棕樹機(jī)房</a><a  target="_blank">成都托管服務(wù)器</a><a  target="_blank">重慶聯(lián)通機(jī)房托管</a><a  target="_blank">光華服務(wù)器托管</a>                </li>
            </ul>
        </div>
        <div   id="squ6kqw"   class="footar fl col-lg-4 col-md-4 col-sm-12 col-xs-12">
            <p>全國免費(fèi)咨詢:</p>
            <b>400-028-6601</b>
            <p>業(yè)務(wù)咨詢:028-86922220 / 13518219792</p>
            <p>節(jié)假值班:18980820575 / 13518219792</p>
            <p>聯(lián)系地址:成都市太升南路288號錦天國際A幢1002號</p>
        </div>
    </div>
    <div   id="squ6kqw"   class="footb">
        <div   id="squ6kqw"   class="copy container">
            <div   id="squ6kqw"   class="fl">Copyright ? 成都創(chuàng)新互聯(lián)科技有限公司重慶分公司  <a  target="_blank">渝ICP備2021005571號</a></div>
            <!--<div   id="squ6kqw"   class="fr"><a  target="_blank">成都網(wǎng)站建設(shè)</a>:<a  target="_blank">創(chuàng)新互聯(lián)</a></div>-->
        </div>
    </div>
    <div   id="squ6kqw"   class="link">
        <div   id="squ6kqw"   class="container">
            友情鏈接::
            <a  target="_blank">成都網(wǎng)站建設(shè)</a>
            <a  target="_blank">重慶網(wǎng)站建設(shè)</a>
            <a href="">四川網(wǎng)站建設(shè)</a>
            <a href="">重慶建設(shè)網(wǎng)站</a>
            <a  target="_blank">移動服務(wù)器托管</a>
            <a  target="_blank">成都服務(wù)器托管</a>
            <a  target="_blank">云服務(wù)器</a>
            <a  target="_blank">廣告設(shè)計(jì)制作</a>
            <a  target="_blank">重慶網(wǎng)頁設(shè)計(jì)</a>
            <a  target="_blank">重慶做網(wǎng)站</a>
            <a  target="_blank">重慶網(wǎng)站制作</a>
            <a href="">重慶網(wǎng)站建設(shè)</a>
            <a href="">重慶網(wǎng)站公司</a>
            <a href="">渝中網(wǎng)站制作</a>
            <a href="">重慶網(wǎng)站設(shè)計(jì)</a>
        </div>
    </div>
</div>
<div   id="squ6kqw"   class="foot">
    <ul class="public-celan">
        <li>
            <a  target="_blank" class="a1 db tc">
                <img src="/Public/Home/img/icon-23.png" alt="" class="db auto">
                <span id="squ6kqw"    class="span-txt">在線咨詢</span>
            </a>
        </li>
        <li>
            <a href="tel:18980820575" class="a1 db tc">
                <img src="/Public/Home/img/icon-24.png" alt="" class="db auto">
                <span id="squ6kqw"    class="span-txt">電話咨詢</span>
            </a>
        </li>
        <li>
            <a target="_blank" href="tencent://message/?uin=1683211881&Site=&Menu=yes" class="a1 db tc">
                <img src="/Public/Home/img/icon-25.png" alt="" class="db auto">
                <span id="squ6kqw"    class="span-txt">QQ咨詢</span>
            </a>
        </li>
        <li>
            <a target="_blank" href="tencent://message/?uin=532337155&Site=&Menu=yes" class="a1 db tc public-yuyue-up">
                <img src="/Public/Home/img/icon-26.png" alt="" class="db auto">
                <span id="squ6kqw"    class="span-txt">預(yù)約顧問</span>
            </a>
        </li>
    </ul>
</div>
<div   id="squ6kqw"   class="customer">
    <dl class="icon1">
        <dt>
            <a href="tencent://message/?uin=1683211881&Site=&Menu=yes">
                <i class="iconT"><img src="/Public/Home/img/QQ.png" alt=""></i>
                <p>在線咨詢</p>
            </a>
        </dt>
    </dl>
    <dl class="icon2">
        <dt><i><img src="/Public/Home/img/weixin.png" alt=""></i><p>微信咨詢</p></dt>
        <dd><img src="/Public/Home/img/ewm.png"></dd>
    </dl>
    <dl class="icon3">
        <dt><i><img src="/Public/Home/img/dianhua.png" alt=""></i><p>電話咨詢</p></dt>
        <dd>
            <p>028-86922220(工作日)</p>
            <p>18980820575(7×24)</p>
        </dd>
    </dl>
    <dl class="icon4">
        <dt class="sShow">
            <a href="tencent://message/?uin=244261566&Site=&Menu=yes">
                <i><img src="/Public/Home/img/dengji.png" alt=""></i><p>提交需求</p>
            </a>
        </dt>
    </dl>
    <dl class="icon5">
        <dt class="gotop">
            <a href="#top">
                <i><img src="/Public/Home/img/top.png" alt=""></i><p>返回頂部</p>
            </a>
        </dt>
    </dl>
</div>

<footer>
<div class="friendship-link">
<p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p>
<a href="http://weahome.cn/" title="真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆">真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆</a>

<div class="friend-links">


</div>
</div>

</footer>


<script>
(function(){
    var bp = document.createElement('script');
    var curProtocol = window.location.protocol.split(':')[0];
    if (curProtocol === 'https') {
        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
    }
    else {
        bp.src = 'http://push.zhanzhang.baidu.com/push.js';
    }
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>
</body><div id="dplph" class="pl_css_ganrao" style="display: none;"><em id="dplph"><strong id="dplph"><progress id="dplph"><dfn id="dplph"></dfn></progress></strong></em><thead id="dplph"></thead><dfn id="dplph"></dfn><address id="dplph"><strike id="dplph"></strike></address><listing id="dplph"></listing><legend id="dplph"></legend><mark id="dplph"></mark><label id="dplph"></label><mark id="dplph"></mark><pre id="dplph"></pre><span id="dplph"><legend id="dplph"><dfn id="dplph"><u id="dplph"></u></dfn></legend></span><meter id="dplph"><pre id="dplph"><p id="dplph"><var id="dplph"></var></p></pre></meter><optgroup id="dplph"><video id="dplph"><em id="dplph"><menuitem id="dplph"></menuitem></em></video></optgroup><div id="dplph"></div><strike id="dplph"><strong id="dplph"></strong></strike><u id="dplph"><ruby id="dplph"><thead id="dplph"><legend id="dplph"></legend></thead></ruby></u><big id="dplph"></big><span id="dplph"><legend id="dplph"><dfn id="dplph"><u id="dplph"></u></dfn></legend></span><b id="dplph"></b><label id="dplph"><th id="dplph"></th></label><b id="dplph"><pre id="dplph"><u id="dplph"><strong id="dplph"></strong></u></pre></b><dfn id="dplph"><u id="dplph"></u></dfn><u id="dplph"><rp id="dplph"><thead id="dplph"><legend id="dplph"></legend></thead></rp></u><rp id="dplph"><font id="dplph"></font></rp><strong id="dplph"><rp id="dplph"><font id="dplph"><progress id="dplph"></progress></font></rp></strong><optgroup id="dplph"><video id="dplph"><em id="dplph"><big id="dplph"></big></em></video></optgroup><ruby id="dplph"><font id="dplph"><legend id="dplph"><sup id="dplph"></sup></legend></font></ruby><thead id="dplph"><label id="dplph"></label></thead><pre id="dplph"><track id="dplph"></track></pre><div id="dplph"><dl id="dplph"><pre id="dplph"><listing id="dplph"></listing></pre></dl></div><label id="dplph"></label><strong id="dplph"></strong><optgroup id="dplph"><video id="dplph"><em id="dplph"><menuitem id="dplph"></menuitem></em></video></optgroup><p id="dplph"><nobr id="dplph"></nobr></p><sup id="dplph"></sup><ol id="dplph"><pre id="dplph"><track id="dplph"><dfn id="dplph"></dfn></track></pre></ol><meter id="dplph"></meter><output id="dplph"></output><big id="dplph"><dl id="dplph"></dl></big><ins id="dplph"><em id="dplph"><strike id="dplph"><ol id="dplph"></ol></strike></em></ins><nobr id="dplph"><small id="dplph"><ins id="dplph"><address id="dplph"></address></ins></small></nobr><strike id="dplph"><var id="dplph"><form id="dplph"><output id="dplph"></output></form></var></strike><thead id="dplph"><label id="dplph"></label></thead><strong id="dplph"><th id="dplph"><font id="dplph"><progress id="dplph"></progress></font></th></strong><strong id="dplph"><rp id="dplph"><font id="dplph"><progress id="dplph"></progress></font></rp></strong><sup id="dplph"></sup><thead id="dplph"><legend id="dplph"></legend></thead><sup id="dplph"><label id="dplph"><th id="dplph"><b id="dplph"></b></th></label></sup><address id="dplph"></address><sup id="dplph"></sup></div>
</html>
<script>
    $(".con img").each(function(){
        var src = $(this).attr("src");    //獲取圖片地址
        var str=new RegExp("http");
        var result=str.test(src);
        if(result==false){
            var url = "https://www.cdcxhl.com"+src;    //絕對路徑
            $(this).attr("src",url);
        }
    });
    window.onload=function(){
        document.oncontextmenu=function(){
            return false;
        }
    }
</script>