Golang学习之net包详解


/**

* 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]))

}

Golang学习之net包详解介绍到这里,更多go学习请参考编程字典go教程 和问答部分,谢谢大家对编程字典的支持。


原文链接:https://blog.csdn.net/yxys01/article/details/78055266