关闭

Golang学习之net包详解

标签: gonet详解
182人阅读 评论(0) 收藏 举报
分类:
/**
 * Created by Administrator on 13-12-9.
 */
package main

import (
    "fmt"
    "os"
    "net"
)

/**
 * 将string类型的ip地址转换为IP对象
 */
func main() {

    name := "192.168.1.97"

    ip := net.ParseIP(name)

    if ip == nil {
        fmt.Fprintf(os.Stderr, "Err:无效的地址")
        return
    }

    fmt.Fprintf(os.Stdout, "IP: %s %s\n", ip, ip.String())
    defaultMask := ip.DefaultMask()
    fmt.Fprintf(os.Stdout, "DefaultMask: %s %s\n", defaultMask, defaultMask.String())

    ones, bits := defaultMask.Size()
    fmt.Fprintf(os.Stdout, "ones: %d bits: %d\n", ones, bits)
}
/**
 * Created by Administrator on 13-12-9.
 */
package main

import (
    "net"
    "fmt"
    "os"
)

/**
 * 根据IP和掩码获得网络
 */
func main() {
    name := "192.168.1.97"

    ip := net.ParseIP(name)

    mask := ip.DefaultMask()

    network := ip.Mask(mask)

    fmt.Fprintf(os.Stdout, "network: %s", network.String()) // 192.168.1.0

    // ip:      192.168.1.97
    // mask:    255.255.255.0
    // network: 192.168.1.0
}
/**
 * Created by Administrator on 13-12-9.
 */
package main

import (
    "net"
    "fmt"
    "os"
)

/**
 * 将域名解析Ip地址
 * 获得域名对应的所有Ip地址
 */
func main() {

    domain := "www.baidu.com"
    ipAddr, err := net.ResolveIPAddr("ip", domain)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Err: %s", err.Error())
        return
    }
    fmt.Fprintf(os.Stdout, "%s IP: %s Network: %s Zone: %s\n", ipAddr.String(), ipAddr.IP, ipAddr.Network(), ipAddr.Zone)

    // 百度,虽然只有一个域名,但实际上,他对应电信,网通,联通等又有多个IP地址
    ns, err := net.LookupHost(domain)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Err: %s", err.Error())
        return
    }

    for _, n := range ns {
        fmt.Fprintf(os.Stdout, "%s", n) // 115.239.210.26    115.239.210.27 这2个地址打开都是百度
    }
}
/**
 * Created by Administrator on 13-12-9.
 */
package main

import (
    "net"
    "fmt"
    "os"
)

/**
 * 查看主机服务器(service)占用的端口,这些服务,都是tcp或者udp的
 */
func main() {

    port, err := net.LookupPort("tcp", "telnet") // 查看telnet服务器使用的端口

    if err != nil {
        fmt.Fprintf(os.Stderr, "未找到指定服务")
        return
    }

    fmt.Fprintf(os.Stdout, "telnet port: %d", port)

}
/**
 * Created by Administrator on 13-12-9.
 */
package main

import (
    "net"
    "fmt"
    "os"
)

func main() {

    // TCPAddr 包涵IP 和 Port

    // 将一个host地址转换为TCPAddr。host=ip:port
    pTCPAddr, err := net.ResolveTCPAddr("tcp", "www.baidu.com:80")
    if err != nil {
        fmt.Fprintf(os.Stderr, "Err: %s", err.Error())
        return
    }

    fmt.Fprintf(os.Stdout, "www.baidu.com:80 IP: %s PORT: %d", pTCPAddr.IP.String(), pTCPAddr.Port)
}
/**
 * Created by Administrator on 13-12-10.
 */
package main

import (
    "net"
    "fmt"
    "os"
    "io/ioutil"
)

func main() {

    url := "www.baidu.com:80"

    pRemoteTCPAddr, err := net.ResolveTCPAddr("tcp4", url)

    if err != nil {
        fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
        return
    }

    // pLocalTCPAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:7070")

    pTCPConn, err := net.DialTCP("tcp", nil/*pLocalTCPAddr*/, pRemoteTCPAddr)

    if err != nil {
        fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
        return
    }


    n, err := pTCPConn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n"))
    if err != nil {
        fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
        return
    }
    defer pTCPConn.Close()

    fmt.Fprintf(os.Stdout, "writed: %d\n", n)

    buf, err := ioutil.ReadAll(pTCPConn)
    r := len(buf)
    fmt.Fprintf(os.Stdout, string(buf[:r]))
    fmt.Fprintf(os.Stdout, "readed: %d\n", r)

}
/**
 * Created by Administrator on 13-12-10.
 */
package main

import (
    "net"
    "fmt"
    "os"
    "time"
)

func main() {

    pTCPAddr, error := net.ResolveTCPAddr("tcp4", ":7070")
    if error != nil {
        fmt.Fprintf(os.Stdout, "Error: %s", error.Error())
        return
    }
    pTCPListener, error := net.ListenTCP("tcp4", pTCPAddr)
    if error != nil {
        fmt.Fprintf(os.Stdout, "Error: %s", error.Error())
        return
    }
    defer pTCPListener.Close()

    for {
        pTCPConn, error := pTCPListener.AcceptTCP()
        if error != nil {
            fmt.Fprintf(os.Stdout, "Error: %s", error.Error())
            continue
        }
        go connHandler(pTCPConn)
    }
}

func connHandler(conn *net.TCPConn) {
    defer conn.Close()
    now := time.Now()
    conn.Write([]byte(now.String() + "\n"))
}
/**
 * Created by Administrator on 13-12-10.
 */
package main

import (
    "net"
    "fmt"
    "os"
    "time"
)

func main() {

    //url := "baidu.com:80"
    url := "facebook.com:80"
    conn, error := net.DialTimeout("tcp", url, time.Second * 10) // 带有超时限制的conn
    if error != nil {
        fmt.Fprintf(os.Stderr, "Error: %s", error.Error())
        return
    }

    n , error := conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n"))
    if error != nil {
        fmt.Fprintf(os.Stderr, "Error: %s", error.Error())
        return
    }

    fmt.Fprintf(os.Stdout, "writed: %d", n)

    buf := make([]byte, 2048)
    n, error = conn.Read(buf)
    if error != nil {
        fmt.Fprintf(os.Stderr, "Error: %s", error.Error())
        return
    }

    fmt.Fprintf(os.Stdout, string(buf[:n]))
}
/**
 * Created by Administrator on 13-12-10.
 */
package main

import (
    "net"
    "fmt"
    "os"
)

/**
 * UDP 服务器
 */
func main() {
    pUDPAddr, err := net.ResolveUDPAddr("udp", ":7070")

    if err != nil {
        fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
        return
    }

    pUDPConn, err := net.ListenUDP("udp", pUDPAddr)

    if err != nil {
        fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
        return
    }

    defer pUDPConn.Close()

    for {

        buf := make([]byte, 256)
        n , pUDPAddr, err := pUDPConn.ReadFromUDP(buf)

        if err != nil {
            fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
            return
        }
        fmt.Fprintf(os.Stdout, "readed: %d", n)

        n, err = pUDPConn.WriteToUDP(buf, pUDPAddr)
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
            return
        }
        fmt.Fprintf(os.Stdout, "writed: %d", n)
    }
}
/**
 * Created by Administrator on 13-12-10.
 */
package main

import (
    "net"
    "fmt"
    "os"
)

/**
 * UDP 客户端
 */
func main() {

    pUDPAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:7070")

    if err != nil {
        fmt.Fprintf(os.Stderr, "Error ResolveUDPAddr: %s", err.Error())
        return
    }

    pUDPConn, err := net.DialUDP("udp", nil, pUDPAddr)

    if err != nil {
        fmt.Fprintf(os.Stderr, "Error DialUDP: %s", err.Error())
        return
    }

    n, err := pUDPConn.Write([]byte("你好啊!!!"))

    if err != nil {
        fmt.Fprintf(os.Stderr, "Error WriteToUDP: %s", err.Error())
        return
    }

    fmt.Fprintf(os.Stdout, "writed: %d", n)

    buf := make([]byte, 1024)
    n, _, err = pUDPConn.ReadFromUDP(buf)

    if err != nil {
        fmt.Fprintf(os.Stderr, "Error ReadFromUDP: %s", err.Error())
        return
    }

    fmt.Fprintf(os.Stdout, "readed: %d  %s", n, string(buf[:n]))
}
/**
 * Created by Administrator on 13-12-10.
 */
package main

import (
    "net"
    "fmt"
    "os"
)

/*
很多时候,服务器会处理多个端口的监听!可以使用select轮询处理这种情况

 */
func main() {

    lsr, err := net.Listen("tcp", ":7070")

    if err != nil {
        fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
        return
    }

    for {
        conn , err := lsr.Accept()
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
            continue
        }

        go connHandler(conn)

    }

    fmt.Println("Done !")
}

func connHandler(conn net.Conn) {
    defer conn.Close()

    var buf[512]byte
    for {
        n , err := conn.Read(buf[0:])
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
            return
        }
        _, err = conn.Write(buf[0:n])
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
            return
        }
    }
}
/**
 * Created by Administrator on 13-12-10.
 */
package main

import (
    "net"
    "fmt"
    "os"
    "bufio"
)

func main() {

    conn, err := net.Dial("tcp", "192.168.1.97:7070")
    if err != nil {
        fmt.Sprint(os.Stderr, "Error: %s", err.Error())
        return
    }


    go func() {
        var buf [512]byte
        for {
            n , err := conn.Read(buf[0:])
            if err != nil {
                fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
                return
            }
            fmt.Fprintf(os.Stdout, string(buf[0:n]))
        }

    }()

    for {
        fmt.Fprintf(os.Stdout, "\n输入:")
        pReader := bufio.NewReader(os.Stdin)
        line, _, err := pReader.ReadLine()
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
            return
        }
        conn.Write(line[0:])
    }
}
/**
 * Created by Administrator on 13-12-10.
 */
package main

import (
    "net"
    "fmt"
    "os"
)

/**
 UDP Server
 */
func main() {

    packetConn, err := net.ListenPacket("udp", ":7070")

    if err != nil {
        fmt.Fprintf(os.Stdout, "Error: %s", err.Error())
        return
    }
    defer packetConn.Close()

    var buf [512]byte
    for {
        n , addr, err := packetConn.ReadFrom(buf[0:])
        if err != nil {
            fmt.Fprintf(os.Stdout, "Error: %s", err.Error())
            return
        }

        fmt.Fprintf(os.Stdout, "recv: %s", string(buf[0:n]))

        _, err = packetConn.WriteTo(buf[0:n], addr)
        if err != nil {
            fmt.Fprintf(os.Stdout, "Error: %s", err.Error())
            return
        }
    }


}
/**
 * Created by Administrator on 13-12-10.
 */
package main

import (
    "net"
    "fmt"
    "os"
    "time"
)

/**
 UDP Client
 */
func main() {
    conn, err := net.Dial("udp", "127.0.0.1:7070")

    if err != nil {
        fmt.Fprintf(os.Stdout, "Error: %s", err.Error())
        return
    }

    defer conn.Close()


    _, err = conn.Write([]byte("你好啊UDP"))
    if err != nil {
        fmt.Fprintf(os.Stdout, "Error: %s", err.Error())
        return
    }

    var buf [512]byte
    conn.SetReadDeadline(time.Now().Add(time.Second * 1))  // 阻塞,直到接收到消息,设置阻塞时间1秒
    n, err := conn.Read(buf[0:])
    if err != nil {
        fmt.Fprintf(os.Stdout, "Error: %s", err.Error())
        return
    }

    fmt.Fprintf(os.Stdout, "recv: %s", string(buf[0:n]))

}

       转自:http://blog.csdn.net/eclipser1987/article/details/17247519?hmsr=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com

0
0
查看评论

golang net包基础解析

这里主要介绍网络包内主要的几个类型。 net包是提供了底层的网络接口的,但是平时我们需要就是两个主要的接口,Listener和Conn。1. ConnConn是一个基本的接口类型,以数据流为向导的网络连接接口。注意他是接口类型,不需要我们来手动构造实现Conn接口。 生成满足Conn接口的类型的...
  • Wu_Roc
  • Wu_Roc
  • 2017-08-14 20:55
  • 272

Go net包介绍

与大多数语言一样,Go的标准库很全,因为Go的出现本来就是为了网络通信的高并发实现,所以其相关的网络库封装得更简洁,更Readable。这里来大致介绍几个网络库,掌握了学习方法,那么只要里面有那个库,你就能找到,就能快速了解怎么查阅。net.ResolveIPAddr()根据域名查找IP地址不得不感...
  • cc7756789w
  • cc7756789w
  • 2016-03-30 15:15
  • 2182

golang 建立web服务器 http包源码详解

golang 建立web服务器 http包源码详解首先,熟悉http协议的都知道,http协议是基于TCP实现的。http服务器的工作方式大概就是监听socket端口,接受连接,获取到请求,处理请求,返回响应。所以,对应的会有几个部分 Request:用户请求的信息。post、get、url等这些信...
  • qq_24850089
  • qq_24850089
  • 2017-02-16 04:21
  • 1367

golang-net/http源码分析之http server

golang-net/http源码分析之http server
  • screscent
  • screscent
  • 2016-12-12 15:52
  • 1661

golang中net包用法(一)

net包对于网络I/O提供了便携式接口,包括TCP/IP,UDP,域名解析以及Unix Socket。尽管net包提供了大量访问底层的接口,但是大多数情况下,客户端仅仅只需要最基本的接口,例如Dial,LIsten,Accepte以及分配的conn连接和listener接口。 crypto/tls包...
  • chenbaoke
  • chenbaoke
  • 2015-01-16 20:30
  • 10182

golang中net包用法

func Listen(net, laddr string) (Listener, error)  //返回在一个本地网络地址laddr上监听的Listener。网络类型参数net必须是面向流的网络:"tcp"、"tcp4"、"tcp6&q...
  • hellochenlu
  • hellochenlu
  • 2016-08-05 19:14
  • 400

Golang学习笔记 包和项目构成

工作目录先来说说Golang的工作目录,安装好Golang后,需要做的一件事情就是设置工作目录,所有的项目、工具、第三方包会存放到工作目录中。默认情况下工作目录是用户目录的go文件夹。我们可以利用环境变量GOPATH来更改Golang工作目录的位置。工作目录的结构是如下这样的。bin文件夹存放项目会...
  • u011054333
  • u011054333
  • 2017-06-01 21:11
  • 386

golang x/net/context包笔记

golang x/net/context包笔记基本是 https://blog.golang.org/context 的笔记,能翻墙的话,还是建议大家看看简介以前一直见到这个包,感觉很神秘,而context的意思让人觉得不知道它到底是干什么的。context包主要用于request请求。reques...
  • sryan
  • sryan
  • 2016-07-20 15:49
  • 3746

Golang context包入门

Golang context包入门 转自:http://studygolang.com/articles/9624 概述 Golang 的 context Package 提供了一种简洁又强大方式来管理 goroutine 的生命周期,同时提供了一种 Requst-Scope K-...
  • yueguanyun
  • yueguanyun
  • 2017-03-22 09:22
  • 4419

go利用x/net/html包实现的蜘蛛

看了网上很多个spider版本, 几乎都是使用regexp包正则匹配实现. 其实使用DOC, 性能更好, 也更优雅 package main import ( "fmt" "net/http" "os" &...
  • black_OX
  • black_OX
  • 2016-07-21 10:46
  • 2019
    个人资料
    • 访问:193119次
    • 积分:4105
    • 等级:
    • 排名:第8984名
    • 原创:178篇
    • 转载:176篇
    • 译文:1篇
    • 评论:18条
    博客专栏
    最新评论