400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Go36-47-基于HTTP协议的网络服务(net/http)-创新互联

基于HTTP协议的网络服务

HTTP协议是基于TCP/IP协议栈的,并且是一个面向普通文本的协议。原则上,使用任何一个文本编辑器,都可以写出一个完整的HTTP请求报文。只要搞清楚了请求报文的头部(header、请求头)和主体(body、请求体)应该包含的内容。
如果只是访问基于HTTP协议的网络服务,那么使用net/http包中的程序实体会非常方便。

网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了阿瓦提免费建站欢迎大家使用!

http.Get函数

调用http.Get函数,只需要传递给它一个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("返回的第一行的内容:", line)
}

http.Get函数会返回两个结果:

http.Get函数会在内部使用缺省的HTTP客户端,并且调用它的Get方法来完成功能。这个缺省的HTTP客户端就是net/http包中的公开变量DefaultClient,源码中是这样的:

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

// 使用缺省的客户端调用Get方法
func Get(url string) () {
    return DefaultClient.Get(url)
}

所以下面的这两行代码:

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

与示例中的这一行代码:

resp, err := http.Get(url)

是等价的。这里只是不使用DefaultClient而是自己创建了一个客户端。

http.Client类型

http.Client是一个结构体,并且它包含的字段都是公开的:

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

该类型是开箱即用的,因为它的所有字段,要么存在相应的缺省值,要么其零值直接就可以使用,并且代表着特定的含义。

Transport字段

主要看下Transport字段,该字段向网络服务发送HTTP请求,并从网络服务接收HTTP响应。该字段的方法RoundTrip应该实现单次HTTP事务(或者说基于HTTP协议的单次交互)需要的所有步骤。这个字段是一个接口:

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事务的超时时间,它是time.Duration类型。它的零值是可用的,用于表示没有设置超时时间。

http.Transport类型

http.Transport类型是一个结构体,该类型包含的字段很多。这里通过http.Client结构体中的Transport字段的缺省值DefaultTransport,来深入了解一下。DefaultTransport是一个*http.Transport的结构体,做了一些默认的设置:

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结构体的指针就是就是RoundTripper接口的默认实现:

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

这个类型是可以被复用的,并且也推荐被复用。同时它也是并发安全的。所以http.Client类型也是一样,推荐复用,并且并发安全。
看上面的默认设置,http.Transport类型,内部的DialContext字段会使用net.Dialer类型的值,并且把Timeout设置为30秒。仔细看,该值是一个方法,这里把Dialer值的DialContext方法赋值给了DefaultTransport里的同名字段,并且已经设置好了调用该方法时的结构体。

操作超时相关字段

http.Transport类型还包含了很多其他的字段,其中有一些字段是关于操作超时的:

TLS 是 Transport Layer Security 的缩写,可以被翻译为传输层安全。

连接数限制相关字段

此外,还有一些与IdleConnTimeout相关的字段值也值得关注:

MaxIdleConns
无论当前访问了多少个网络服务,MaxIdleConns字段只会对空闲连接的总数做限定。

MaxIdleConnsPerHost
而MaxIdleConnsPerHost字段限定的是,每一个网络服务的大空闲连接数。每一个网络服务都有自己的网络地址,可能会使用不同的网络协议,对于一些HTTP请求也可能会用到代理。地址、协议、代理,通脱这三个方面的具体情况来鉴别不同的网络服务。
MaxIdleConnsPerHost是有缺省值的,由常量http.DefaultMaxIdleConnsPerHost表示,值为2:

const DefaultMaxIdleConnsPerHost = 2

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

在默认情况下,每一个网络服务,它的空闲连接数最多只能由2个。

MaxConnsPerHost
MaxConnsPerHost字段限制针对每一个网络服务的大连接数,不论这些链接是否是空闲的。并且,该字段没有相应的缺省值,零值就是不做限制。

小结
不限制连接数,默认也不限制每一个网络服务的连接数。要限制整体的空闲连接数以及严格限制对每一个网络服务的空闲连接数。

空闲的连接

简单说明一下,为什么会出现空闲的连接。
HTTP协议的请求头里有一个Connection。在HTTP协议的1.1版本中,默认值是“keep-alive”。在这种情况下的网络连接是持久连接的,它们会在当前的HTTP事务完成后仍然保持着连通性,因此是可以被复用的。
既然连接可以被复用,就会有两种可能:

  1. 针对同一个网络服务,有新的HTTP请求被提交,该连接被再次使用。
  2. 不再对该网络服务提交HTTP请求,该连接被闲置。这样就产生了空闲的连接。

另外,如果分配给某一个网络服务的连接过多的话,也可能会导致空闲连接的产生。因为没一个HTTP请求只会使用一个空闲的连接。所以,在大多数情况下,都需要限制空闲连接数。

关闭keep-alive
另外,请求头的Connection还可以设置为“close”,这样就彻彻底杜绝了空闲连接的生成。这会告诉网络服务,这个网络连接不必保持,当前的HTTP事务完成后就可以断开它了。做法是在初始化Transport值的时候,将DisableKeepAlives字段设置为true。
这么做的话,每次提交HTTP请求,就会产生一个新的网络连接。这样会明显的加重网络服务以及客户端的负载,并会让每个HTTP事务都耗费更多的时间。所以默认不设置这个DisableKeepAlives字段。

net.Dialer类型

http.Transport类型,内部的DialContext字段会使用net.Dialer类型的值。在net.Dialer类型中,也有一个KeepAlive字段。该字段是直接作用在底层的socket上的。
它的背后是一种针对网络连接(更确切的是说,是TCP连接)的存活探测机制。它的值用于表示每间隔多长时间发送一次探测包。当该值不大于0是,则表示不开启这种机制。
DefaultTransport会把这个字段设置为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("持续时间: %s\n", diff))
                fmt.Println(logBuf.String())
                wg.Done()
            }()
            url := "https://" + domain
            logBuf.WriteString(fmt.Sprintf("发送请求: %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是相对应的。http.Server代表的是基于HTTP协议的服务端,或者说网络服务。</p><h3>ListenAndServe方法</h3><p>http.Server类型的ListenAndServe方法的功能是:监听一个基于TCP协议的网络地址,并对接收到的HTTP请求进行处理。这个方法会默认开启针对网络连接的存活探测机制,以保证连接是持久的。同时,该方法会一直执行,直到有严重的错误发生或者被外界关掉。当被外界关掉时,它会返回一个由http.ErrServerClosed变量代表的错误值。<br/>这个ListenAndServe方法主要会做以下几件事情:</p><ol><li>检查当前的http.Server类型的值的Addr字段。Addr是当前的网络服务需要使用的网络地址,即:IP地址和端口号。如果这个字段的值为空字符串,那么就用":http"代替。也就是说,使用任何可以代表本机的域名和IP地址,并且端口号为80。</li><li>通过调用net.Listen函数在已确定的网络地址上启动基于TCP协议的监听。</li><li>检查net.Listen函数返回的错误值。如果该错误值不为nil,那么就直接返回该错误值。否则,通过调用当前http.Server值的Serve方法准备接受和处理将要到来的HTP请求。</li></ol><p>这里又牵出两个问题:</p><ol><li>net.Listen函数</li><li>http.Server类型的Serve方法</li></ol><h3>net.Listen函数</h3><p>net.Listen函数的作用:</p><ul><li>解析参数值中包含的网络地址隐含的IP地址和端口号</li><li>根据给定的网络协议,确定监听的方法,并开始进行监听</li></ul><p>再往下深入的话,就会涉及到net.socket函数以及相关的socket知识。就此打住。</p><h3>http.Server类型的Serve方法</h3><p>在一个for循环中,网络监听器Accept方法会不断地调用,该方法的源码如下:</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方法会返回两个结果值:</p><ul><li>net.Conn : 代表包含了新到来的HTTP请求的网络连接</li><li>error : 代表了可能发生的错误的error的类型值</li></ul><p>当错误值不为nil时,如果此时是一个暂时性的错误,那么循环的下一次迭代将会在一段时间之后开始执行。否则,循环会被终止。<br/>如果没有错误,返回的错误值就是nil。那么这里的程序将会把它的第一个结果值包装成一个*http.conn类型的值,然后通过在新的goroutine中调用这个conn值的serve方法,来对当前的HTTP请求进行处理。</p><p>上面最后说的处理的细节还是很多的:</p><ul><li>conn值的各种状态,各状态代表的处理阶段</li><li>处理过程中会用到的读取器和写入器,及其作用</li><li>让程序调用自定义的处理函数</li></ul><p>这些都没有一一说明,建议去看下源码。</p><h3>Server示例</h3><p>在下面的示例中,启动了3个Server。启动后,可以用浏览器访问进行验证:</p><pre><code>package main

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

var wg sync.WaitGroup

// 一般没有这么用的,http.Server的Handler字段
// 要么是nil,就用包里的http.DefaultServeMux
// 要么用NewServeMux()来创建一个*http.ServeMux
// 我这里按照http.Handler接口的要求实现了一个,赋值给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("启动服务,访问: 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)
        }
    }
}

// 这个最简单,都是调用http包里的函数。本质上还是要调用方法的,都会用默认的或是零值
func startServer2() {
    defer wg.Done()
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello World\nThis is Server2")
    })
    fmt.Println("启动服务,访问: http://127.0.0.1:8002")
    // 第二个参数传nil,就是用包里的http.DefaultServeMux,或者也可以自己创建一个传给第二个参数
    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请求的参数,并且还设置了2个路由
func startServer3() {
    defer wg.Done()
    mux := http.NewServeMux()
    mux.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path != "/hi" {
            // 这个分支应该是进不来的,因为要进入这个分支,路径应该必须是"/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函数来启动服务
    // 这样的用法可以对http.Server里更多的字段进行自定义
    httpServer := http.Server{
        Addr: "127.0.0.1:8003",
        Handler: mux,
    }
    fmt.Println("启动服务,访问: 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>补充-优雅的停止HTTP服务</h3><p>包里还提供了一个Shutdown方法,可以优雅的停止HTTP服务:</p><pre><code>func (srv *Server) Shutdown(ctx context.Context) error {
    // 内容省略
}</code></pre><p>我们要做的就是在需要的时候,可以调用该Shutdown方法。<br/>这里的问题是,调用了ListenAndServe方法之后,就进入了无限循环的流程。这里最好是用一个goroutine来启动ListenAndServe方法,在goroutine外声明http.Server。然后在主线程里等待一个信号,比如是从通道接收值。这样就可以在主线程里调用这个Shutdown方法执行了。</p><p>创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。</p>        <br>
        网页题目:Go36-47-基于HTTP协议的网络服务(net/http)-创新互联        <br>
        转载来源:<a href="http://mbwzsj.com/article/depcgj.html">http://mbwzsj.com/article/depcgj.html</a>
    </div>
    <div class="other">
        <h3>其他资讯</h3>
        <ul>
            <li><a href="/article/dsedjpg.html">css文字样式和边框样式,css文本框样式</a></li><li><a href="/article/dsedjje.html">ios开发录制视频,ios 录制</a></li><li><a href="/article/dsedjjd.html">python中空格函数库,Python 空</a></li><li><a href="/article/dsedjho.html">菜鸟html5,菜鸟HTML</a></li><li><a href="/article/dsedjjc.html">css样式颜色,css样式颜色搭配</a></li>        </ul>
    </div>
</div>
<div class="oneE">
    <div class="oneEa container wow fadeInUp">
        <ul>
            <li>
                <dd><img src="/Public/Home/img/oe1.png" alt=""></dd>
                <h3>网站建设专属方案</h3>
            </li>
            <li>
                <dd><img src="/Public/Home/img/oe2.png" alt=""></dd>
                <h3>网站定制化设计</h3>
            </li>
            <li>
                <dd><img src="/Public/Home/img/oe3.png" alt=""></dd>
                <h3>7X24小时服务</h3>
            </li>
            <li>
                <dd><img src="/Public/Home/img/oe4.png" alt=""></dd>
                <h3>N对管家服务</h3>
            </li>
        </ul>
    </div>
    <div class="oneEb container wow fadeInUp">
        <h2>让你的专属顾问为你服务</h2>
        <form action="">
            <input type="text" placeholder="需求">
            <input type="text" placeholder="输入你的联系方式(微信或电话号码)">
            <button>立即联系</button>
        </form>
    </div>
</div>
<footer>
    <div class="foot container">
        <div class="footl">
            <img src="/Public/Home/img/logo.png" alt="">
            <p>用前卫的视觉</p>
            <p>把握好每一个细节</p>
        </div>
        <div class="footc">
            <dl>
                <dt>服务项目</dt>
                <dd><a href="">网站建设</a></dd>
                <dd><a href="">网站优化</a></dd>
                <dd><a href="">网站设计</a></dd>
                <dd><a href="">小程序开发</a></dd>
                <dd><a href="">电商平台</a></dd>
            </dl>
            <dl>
                <dt>客户案例</dt>
                <dd><a href="">网站案例</a></dd>
                <dd><a href="">优化案例</a></dd>
                <dd><a href="">外贸网站案例</a></dd>
            </dl>
            <dl>
                <dt>资讯中心</dt>
                <dd><a href="">建站动态</a></dd>
                <dd><a href="">网站知识</a></dd>
                <dd><a href="">网站运营</a></dd>
            </dl>
            <dl>
                <dt>快捷导航</dt>
                <dd><a href="">关于翔捷宏鑫</a></dd>
                <dd><a href="">联系方式</a></dd>
            </dl>
        </div>
        <div class="footr">
            <h3>联系方式</h3>
            <p>地址:成都市太升南路288号锦天国际A幢1002号</p>
            <div class="tel">
                <i><img src="/Public/Home/img/ftel.png" alt=""></i><a href="tel:13518219792">电话:13518219792</a>
            </div>
        </div>
    </div>
    <div class="yqlink container">
        标签:
        <a href="http://www.zsjierui.cn/" target="_blank">资阳</a>
        <a href="http://www.wzjierui.cn/" target="_blank">温江</a>
        <a href="http://www.ndjierui.cn/" target="_blank">南部</a>
        <a href="http://www.ptjierui.cn/" target="_blank">郫县</a>
        <a href="http://www.hzjierui.cn/" target="_blank">彭州</a>
        <a href="http://www.ncjierui.cn/" target="_blank">彭山</a>
        <a href="http://www.whjierui.cn/" target="_blank">乐山</a>
        <a href="http://www.ahjierui.cn/" target="_blank">简阳</a>
        <a href="http://www.csjierui.cn/" target="_blank">绵阳</a>
        <a href="http://www.qhjierui.cn/" target="_blank">德阳</a>
        <a href="http://www.scjierui.cn/" target="_blank">四川</a>
        <a href="http://www.tjjierui.cn/" target="_blank">什邡</a>
        <a href="http://www.tyjierui.cn/" target="_blank">绵竹</a>
        <a href="http://www.xzjierui.cn/" target="_blank">眉山</a>
        <a href="http://www.sxjierui.cn/" target="_blank">双流</a>
        <a href="http://www.ptruijie.cn/" target="_blank">新都</a>
        <a href="http://www.xjjierui.cn/" target="_blank">新津</a>
        <a href="http://www.jljierui.cn/" target="_blank">龙泉</a>
        <a href="http://www.gyruijie.cn/" target="_blank">广汉</a>
        <a href="http://www.csruizhi.cn/" target="_blank">崇州</a>
        <a href="http://www.zjjierui.cn/" target="_blank">广元</a>
        <a href="http://www.zzjierui.cn/" target="_blank">广安</a>
        <a href="http://www.hnjierui.cn/" target="_blank">巴中</a>
        <a href="http://www.fjjierui.cn/" target="_blank">达州</a>
        <a href="http://www.gyjierui.cn/" target="_blank">南充</a>
        <a href="http://www.fzjierui.cn/" target="_blank">遂宁</a>
        <a href="http://www.cdjierui.cn/" target="_blank">广安</a>
        <a href="http://www.jxjierui.cn/" target="_blank">内江</a>
        <a href="http://www.jxruijie.cn/" target="_blank">自贡</a>
        <a href="http://www.hyruijie.cn/" target="_blank">泸州</a>
        <a href="http://www.gzruizhi.cn/" target="_blank">宜宾</a>
    </div>
    <div class="copy container">
        <div class="copyl">
            © Copyright 2025 青羊区翔捷宏鑫字牌设计制作工作室(个体工商户) 版权所有 <a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow" style="color:#FFFFFF">蜀ICP备2025123194号-11</a>
            <a href="https://www.cdcxhl.com/menu.html">网站地图</a>
            <a href="https://www.cdcxhl.com/articles/" rel="nofollow">其他文章分类</a>
            <a href="http://www.mbwzsj.com/">马边翔捷宏鑫建站</a>
        </div>
        <div class="copyr">
            <i><img src="/Public/Home/img/foot1.png" alt=""></i>
            <i><img src="/Public/Home/img/foot2.png" alt=""></i>
            <i><img src="/Public/Home/img/foot3.png" alt=""></i>
            <i><img src="/Public/Home/img/foot4.png" alt=""></i>
        </div>
    </div>
    <div class="bq_tag container">
        热门推荐:
        <a href="https://www.cdcxhl.com/waimao.html" target="_blank">外贸营销网站建设</a><a href="https://www.cdcxhl.cn/
" target="_blank">免备案空间</a><a href="http://www.cdkjz.cn/fangan/response/" target="_blank">响应式网站建设方案</a><a href="http://seo.cdkjz.cn/" target="_blank">关键词优化</a><a href="http://www.idckuai.cn/" target="_blank">虚拟主机</a><a href="http://www.cdxwcx.cn/tuoguan/yaan.html" target="_blank">雅安服务器托管</a><a href="http://www.cdxwcx.cn/" target="_blank">成都网站制作公司</a><a href="http://chengdu.cdcxhl.com/dingzhi/" target="_blank">APP定制开发</a><a href="http://www.ncwzjz.com/" target="_blank">ncwzjz.com</a><a href="http://chengdu.cdcxhl.cn/jianshe/
" target="_blank">成都网站建设</a><a href="https://www.cdcxhl.com/idc/zongshu.html" target="_blank">成都棕数机房</a><a href="http://www.tfchn.cn/" target="_blank">传美奇电气</a>    </div>
</footer>
<div class="footbarline"></div>
<div id="footbar" class="uin0">
    <ul>
        <li class="on" data-href="/"><a><i><svg t="1638436981291" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2991" width="48" height="48"><path d="M958.400956 451.54921c-0.058328-5.760191-2.597151-11.215436-6.965645-14.97097L524.345166 69.511143c-7.498788-6.445806-18.581194-6.445806-26.079982 0L309.582871 231.6755l0-102.017488c0-11.04966-8.901741-19.532869-19.951401-19.532869l-88.034009 0c-11.048637 0-19.928888 8.482185-19.928888 19.532869l0 211.954343L71.176063 436.57824c-4.423753 3.800559-6.967692 9.341762-6.967692 15.173584l0 105.500822c0 7.819083 4.554736 14.921851 11.660574 18.183128 2.670829 1.226944 5.51562 1.824555 8.343015 1.824555 4.699022 0 9.346879-1.654686 13.048177-4.836145l53.29788-45.825698 0 324.100516c0 60.677964 49.364291 110.042255 110.042255 110.042255L764.792447 960.741257c60.677964 0 110.042255-49.364291 110.042255-110.042255L874.834702 527.026228l51.585889 44.335764c5.955642 5.119601 14.356986 6.282077 21.481244 2.965541 7.122211-3.313465 11.645225-10.488889 11.565407-18.342764L958.400956 451.54921zM221.578538 150.034085l48.095391 0 0 115.941616-48.095391 41.336454L221.578538 150.034085zM570.718333 920.725892 436.666244 920.725892 436.666244 700.642404c0-11.031241 8.976442-20.007683 20.007683-20.007683l94.0357 0c11.031241 0 20.007683 8.976442 20.007683 20.007683L570.71731 920.725892zM834.818313 495.895207l0 354.803795c0 38.612413-31.414477 70.02689-70.02689 70.02689l-154.058748 0L610.732675 700.642404c0-33.096792-26.926256-60.023048-60.023048-60.023048l-94.0357 0c-33.096792 0-60.023048 26.926256-60.023048 60.023048l0 220.084511L260.59925 920.726915c-38.612413 0-70.02689-31.414477-70.02689-70.02689L190.57236 495.895207c0-1.172709-0.121773-2.314719-0.315178-3.432169l322.113255-276.958846 322.70268 277.348726C834.921667 493.848595 834.818313 494.858598 834.818313 495.895207zM525.411451 173.947727c-7.502881-6.445806-18.587334-6.446829-26.086122 0.00307L104.223736 513.663896l0-52.726875 407.081439-349.870436 407.176606 349.9523 0.521886 51.205219L525.411451 173.947727z" p-id="2992" fill="#2c2c2c"></path></svg><p>首页</p></i></a></li>
        <li><a href="tel:13518219792"><i><svg t="1638437906526" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4519" width="48" height="48"><path d="M705.74 604.873333a53.4 53.4 0 0 0-75.426667 0l-37.713333 37.713334c-21.333333 21.333333-90.413333 0.1-150.846667-60.34S360.046667 452.76 381.413333 431.4l0.046667-0.046667 37.666667-37.666666a53.4 53.4 0 0 0 0-75.426667l-165.94-165.933333a53.393333 53.393333 0 0 0-75.42 0l-37.713334 37.713333c-27.866667 27.866667-44.84 64.52-50.46 108.946667-5.213333 41.206667-0.406667 87.42 14.28 137.333333C133.333333 536.586667 199.773333 642 290.9 733.1S487.42 890.666667 587.653333 920.126667c36.926667 10.86 71.813333 16.32 104.146667 16.32a264.333333 264.333333 0 0 0 33.213333-2.04c44.426667-5.62 81.08-22.593333 108.946667-50.46l37.713333-37.713334a53.393333 53.393333 0 0 0 0-75.42z m135.76 211.193334l-37.706667 37.713333c-42.58 42.573333-115.06 51.6-204.1 25.413333-93.506667-27.5-192.453333-90.1-278.62-176.266666s-148.766667-185.113333-176.266666-278.62c-26.186667-89.033333-17.16-161.52 25.413333-204.1l37.713333-37.706667a10.666667 10.666667 0 0 1 15.086667 0l165.933333 165.933333a10.666667 10.666667 0 0 1 0 15.086667l-37.713333 37.706667C329.113333 423.333333 324.666667 458.82 338.766667 501.073333c12.426667 37.273333 38.286667 76.813333 72.813333 111.333334s74.073333 60.386667 111.333333 72.813333c16.213333 5.406667 31.42 8.08 45.26 8.08 22.233333 0 40.946667-6.913333 54.586667-20.553333l37.706667-37.713334a10.666667 10.666667 0 0 1 15.086666 0l165.933334 165.933334a10.666667 10.666667 0 0 1 0.013333 15.1zM576 234.666667a21.333333 21.333333 0 0 1 21.333333-21.333334 213.333333 213.333333 0 0 1 213.333334 213.333334 21.333333 21.333333 0 0 1-42.666667 0c0-94.106667-76.56-170.666667-170.666667-170.666667a21.333333 21.333333 0 0 1-21.333333-21.333333z m0 128a21.333333 21.333333 0 0 1 21.333333-21.333334 85.426667 85.426667 0 0 1 85.333334 85.333334 21.333333 21.333333 0 0 1-42.666667 0 42.713333 42.713333 0 0 0-42.666667-42.666667 21.333333 21.333333 0 0 1-21.333333-21.333333z m362.666667 64a21.333333 21.333333 0 0 1-42.666667 0c0-164.666667-134-298.666667-298.666667-298.666667a21.333333 21.333333 0 0 1 0-42.666667 341.073333 341.073333 0 0 1 341.333334 341.333334z" fill="#2c2c2c" p-id="4520"></path></svg><p>电话</p></i></a></li>
        <li><a class="opwx"><i><svg t="1638438138558" class="icon" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10851" width="48" height="48"><path d="M498.816 345.056c26.336 0 43.936-17.632 43.936-43.904 0-26.56-17.568-43.744-43.936-43.744s-52.832 17.184-52.832 43.744C446.016 327.424 472.48 345.056 498.816 345.056zM253.088 257.408c-26.336 0-52.96 17.184-52.96 43.744 0 26.272 26.624 43.904 52.96 43.904 26.24 0 43.808-17.632 43.808-43.904C296.864 274.592 279.328 257.408 253.088 257.408zM1024 626.112c0-138.88-128.832-257.216-286.976-269.536 0.224-1.728 0.32-3.52-0.064-5.312-31.712-147.84-190.688-259.296-369.824-259.296C164.704 91.968 0 233.12 0 406.624c0 93.088 47.52 176.96 137.568 243.104l-31.392 94.368c-2.016 6.144-0.192 12.896 4.704 17.152 2.976 2.56 6.72 3.904 10.496 3.904 2.432 0 4.896-0.576 7.168-1.696L246.4 704.48l14.528 2.944c36.288 7.456 67.616 13.92 106.208 13.92 11.36 0 22.88-0.512 34.176-1.472 4.576-0.384 8.448-2.688 11.072-6.016 42.496 106.336 159.616 183.104 297.44 183.104 35.296 0 71.04-8.512 103.104-16.544l90.848 49.664c2.4 1.312 5.056 1.984 7.68 1.984 3.584 0 7.168-1.216 10.048-3.552 5.056-4.096 7.136-10.848 5.248-17.024l-23.2-77.152C981.344 772.864 1024 699.328 1024 626.112zM398.592 687.968c-10.4 0.896-20.96 1.344-31.424 1.344-35.328 0-65.216-6.112-99.776-13.248L247.296 672c-3.456-0.736-7.104-0.256-10.272 1.376l-88.288 44.192 22.944-68.928c2.24-6.752-0.224-14.112-6.016-18.176C76.96 568.64 32 493.312 32 406.624c0-155.84 150.336-282.656 335.136-282.656 163.36 0 308 99.392 337.856 231.584-171.296 2.24-309.888 122.656-309.888 270.56 0 21.504 3.264 42.336 8.768 62.432C402.208 688.128 400.448 687.808 398.592 687.968zM875.456 815.552c-5.344 4.032-7.616 10.976-5.696 17.376l15.136 50.336-62.112-33.984c-2.368-1.312-5.024-1.984-7.68-1.984-1.312 0-2.624 0.16-3.904 0.512-33.312 8.416-67.776 17.088-101.344 17.088-155.904 0-282.72-107.136-282.72-238.816 0-131.68 126.816-238.784 282.72-238.784 152.928 0 282.144 109.344 282.144 238.784C992 691.744 950.624 759.04 875.456 815.552zM612.992 511.968c-17.568 0-35.136 17.696-35.136 35.232 0 17.664 17.568 35.104 35.136 35.104 26.4 0 43.84-17.44 43.84-35.104C656.832 529.632 639.392 511.968 612.992 511.968zM806.016 511.968c-17.312 0-34.88 17.696-34.88 35.232 0 17.664 17.568 35.104 34.88 35.104 26.304 0 44.064-17.44 44.064-35.104C850.08 529.632 832.352 511.968 806.016 511.968z" p-id="10852" fill="#2c2c2c"></path></svg><p>微信</p></i></a></li>
        <li data-href="/about/"><a><i><svg t="1638438056011" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9170" width="48" height="48"><path d="M896 405.333333v128c0 34.133333-29.866667 64-64 64S768 567.466667 768 533.333333v-128c0-17.066667 8.533333-34.133333 17.066667-42.666666C733.866667 251.733333 640 170.666667 516.266667 170.666667H512c-128 0-221.866667 81.066667-273.066667 192 8.533333 8.533333 17.066667 25.6 17.066667 42.666666v128c0 34.133333-29.866667 64-64 64S128 567.466667 128 533.333333v-128C128 371.2 157.866667 341.333333 192 341.333333h4.266667c51.2-123.733333 174.933333-213.333333 315.733333-213.333333s264.533333 89.6 315.733333 213.333333h4.266667c34.133333 0 64 29.866667 64 64zM896 896H128c0-98.133333 170.666667-213.333333 384-213.333333s384 115.2 384 213.333333z m-59.733333-42.666667c-42.666667-59.733333-170.666667-128-324.266667-128s-281.6 68.266667-324.266667 128h648.533334zM512 682.666667c-119.466667 0-213.333333-93.866667-213.333333-213.333334s93.866667-213.333333 213.333333-213.333333 213.333333 93.866667 213.333333 213.333333-93.866667 213.333333-213.333333 213.333334z m170.666667-213.333334c0-93.866667-76.8-170.666667-170.666667-170.666666s-170.666667 76.8-170.666667 170.666666 76.8 170.666667 170.666667 170.666667 170.666667-76.8 170.666667-170.666667z" fill="#2c2c2c" p-id="9171"></path></svg><p>联系</p></i></a></li>
    </ul>
    <div class="fbrbg"><img src="/Public/Home/img/fbarbg.png"></div>
</div>
</body>
</html>
<script src="/Public/Home/js/jquery.min.js"></script>
<script src="/Public/Home/js/wow.min.js"></script>
<script src="/Public/Home/js/common.js"></script>
<script>
    $(".ny_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);
        }
    });
</script>