Golang学习之net包详解

转载 2017年09月21日 18:15:37
/**
 * 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

Golang学习之net包介绍

与大多数语言一样,Go的标准库很全,因为Go的出现本来就是为了网络通信的高并发实现,所以其相关的网络库封装得更简洁,更Readable。 这里来大致介绍几个网络库,掌握了学习方法,那么只要里面有那...
  • yxys01
  • yxys01
  • 2017年09月21日 17:57
  • 157

golang.org.x.net.tar.gz包下载

  • 2017年08月19日 09:11
  • 914KB
  • 下载

golang中net包用法(三)--TCP和UDP以及Unix domain socket

type TCPAddr  //表示TCP终端地址 type TCPAddr struct { IP IP Port int Zone string // IPv...

golang中net包用法(一)

net包对于网络I/O提供了便携式接口,包括TCP/IP,UDP,域名解析以及Unix Socket。尽管net包提供了大量访问底层的接口,但是大多数情况下,客户端仅仅只需要最基本的接口,例如Dial...

Golang在windows下的socket编程(不使用net包和Cgo)

go也可以想普通的socket编程那样: 创建套接字 -> 绑定 -> 监听 … 当然,go中有net包可以使用,但是如果要实现一些比较底层的操作,例如自己构造数据包,就可以通过这种比较原始的方式来进...

golang中net/http包用法

1. 前言 http包包含http客户端和服务端的实现,利用Get,Head,Post,以及PostForm实现HTTP或者HTTPS的请求. 2. 本文分析内容安排 函数 Execute...

golang net/http包使用

http客户端import “net/http” http包提供了HTTP客户端和服务端的实现。Get、Head、Post和PostForm函数发出HTTP/ HTTPS请求。package mai...

golang中net包用法(二)--IP

IP地址(Internet Protocol Address,称为互联网协议地址,简写为IP Address),是一种给主机在Internet上进行编址的方式。 type IP  //IP表示一...

golang中net/http包用法

http包包含http客户端和服务端的实现,利用Get,Head,Post,以及PostForm实现HTTP或者HTTPS的请求. 当客户端使用完response body后必须使用close对其进...

Golang flag包使用详解(一)

概述 flag包提供了一系列解析命令行参数的功能接口 命令行语法 命令行语法主要有以下几种形式 -flag //只支持bool类型 -flag=x -flag x //只支持非bool类型 ...
  • thulpf
  • thulpf
  • 2014年11月20日 13:58
  • 1211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Golang学习之net包详解
举报原因:
原因补充:

(最多只允许输入30个字)