go net 包详解1

/**
 * 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 %sn", ip, ip.String())
 defaultMask := ip.DefaultMask()
 fmt.Fprintf(os.Stdout, "DefaultMask: %s %sn", defaultMask, defaultMask.String())

ones, bits := defaultMask.Size()
 fmt.Fprintf(os.Stdout, "ones: %d bits: %dn", 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: %sn", 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.0rnrn"))
 if err != nil {
 fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
 return
 }
 defer pTCPConn.Close()

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

buf, err := ioutil.ReadAll(pTCPConn)
 r := len(buf)
 fmt.Fprintf(os.Stdout, string(buf[:r]))
 fmt.Fprintf(os.Stdout, "readed: %dn", 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.0rnrn"))
 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]))

}

未经允许不得转载:SuperMan's blog » go net 包详解1

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址