net包是go的基础网络包,常用于进行网络连接socket操作,其中Dial是最常用的。今天就对Dial文件里面的方法进行下总结。
Dial文件里面5个结构体分别为:
1、Dialer
2、sysDialer
3、ListenConfig
4、sysListener
5、Resolver
对外公开的方法有四个
1、Dial() 创建一个socket连接,在文件里还给了几个例子,具体用法可以参考示例
// Examples:
// Dial("ip4:1", "192.0.2.1")
// Dial("ip6:ipv6-icmp", "2001:db8::1")
// Dial("ip6:58", "fe80::1%lo0")
//
// For TCP, UDP and IP networks, if the host is empty or a literal
// unspecified IP address, as in ":80", "0.0.0.0:80" or "[::]:80" for
// TCP and UDP, "", "0.0.0.0" or "::" for IP, the local system is
// assumed.
//
// For Unix networks, the address must be a file system path.
func Dial(network, address string) (Conn, error) {
var d Dialer
return d.Dial(network, address)
}
2、 DialTimeout 该方法是调用Dial方法,增加了一个超时时间控制。
func DialTimeout(network, address string, timeout time.Duration) (Conn, error) {
d := Dialer{Timeout: timeout}
return d.Dial(network, address)
}
3、Listen 服务端开启服务监听。支持"tcp", "tcp4", "tcp6", "unix" or "unixpacket" 协议
func Listen(network, address string) (Listener, error) {
var lc ListenConfig
return lc.Listen(context.Background(), network, address)
}
4、ListenPacket 与三功能相似,只是支持协议为"udp", "udp4", "udp6", "unixgram", 或 IP协议
func ListenPacket(network, address string) (PacketConn, error) {
var lc ListenConfig
return lc.ListenPacket(context.Background(), network, address)
}
下面举例说明怎么通过这几个方法,创建一个简单的socket服务
1、服务端代码
unc main() {
ln, err := net.Listen("tcp", ":9999")
if err != nil {
// handle error
}
for {
conn, err := ln.Accept()
if err != nil {
// handle error
continue
}
go handleConnection(conn)
}
}
func handleConnection(c net.Conn) {
defer c.Close();
data := make([]byte, 256);
_,err:=c.Read(data)
if err!=nil{
fmt.Println(err.Error())
}
fmt.Println(string(data))
c.Write([]byte("hello " + time.Now().String()+"\n"));
}
2、客户端代码
conn, err := net.Dial("tcp", "127.0.0.1:9999")
if err != nil {
// handle error
}
fmt.Fprintf(conn, "hello world")
status, err := bufio.NewReader(conn).ReadString('\n')
fmt.Println(status)
通过上面的示例,可以看到用go写个网络服务是多么简单,同时也在于go的net包底层封装的多么好,让你只需要简单几行代码,就可以实现一个网络服务。下一篇分析下net/http 包。