Golang网络编程一 初探

使用Golang建立客户端与服务端的通信,是一个非常简单的过程,步骤如下:

1、服务端开启监听

2、服务端创建连接

3、客户端发起连接请求,并建立连接(与服务端步骤1和2没有先后顺序)

4、服务端和客户端通信通过连接的read和write方法

在这里我们先不讲解网络编程的各种概念和协议,只来熟悉Golang的网络编程基本使用方式。

客户端的使用

客户端连接:使用type Dialer来创建

type Dialer struct {
    // Timeout是dial操作等待连接建立的最大时长,默认值代表没有超时。
    // 如果Deadline字段也被设置了,dial操作也可能更早失败。
    // 不管有没有设置超时,操作系统都可能强制执行它的超时设置。
    // 例如,TCP(系统)超时一般在3分钟左右。
    Timeout time.Duration
    // Deadline是一个具体的时间点期限,超过该期限后,dial操作就会失败。
    // 如果Timeout字段也被设置了,dial操作也可能更早失败。
    // 零值表示没有期限,即遵守操作系统的超时设置。
    Deadline time.Time
    // LocalAddr是dial一个地址时使用的本地地址。
    // 该地址必须是与dial的网络相容的类型。
    // 如果为nil,将会自动选择一个本地地址。
    LocalAddr Addr
    // DualStack允许单次dial操作在网络类型为"tcp",
    // 且目的地是一个主机名的DNS记录具有多个地址时,
    // 尝试建立多个IPv4和IPv6连接,并返回第一个建立的连接。
    DualStack bool
    // KeepAlive指定一个活动的网络连接的生命周期;如果为0,会禁止keep-alive。
    // 不支持keep-alive的网络连接会忽略本字段。
    KeepAlive time.Duration
}

连接方法:

func (d *Dialer) Dial(network, address string) (Conn, error)

使用Dial方法后,返回值就是Conn,使用Conn就可以向服务端发送数据,并从服务端接收数据。

服务端的使用

服务端监听:使用type Listener

type Listener interface {
    // Addr返回该接口的网络地址
    Addr() Addr
    // Accept等待并返回下一个连接到该接口的连接
    Accept() (c Conn, err error)
    // Close关闭该接口,并使任何阻塞的Accept操作都会不再阻塞并返回错误。
    Close() error
}

方法:

func Listen(net, laddr string) (Listener, error)

使用这个方法,监听服务器端的某个端口,请求该端口的请求,将会拦截处理。

监听到请求后,还需要使用listener中的Accept(),获取到conn,然后进行收发数据。

func Accept() (c Conn, err error)

客户端和服务端中都用到了Conn,我们看一下type Conn 中的几个重要方法:

type Conn interface {
  
      Read(b []byte) (n int, err error)
  
      Write(b []byte) (n int, err error)
  
      Close() error
      
      ...略去部分方法
}

伪代码如下

服务端代码:

ln, err := net.Listen("tcp", ":8080")
if err != nil {
	// handle error
}
for {
	conn, err := ln.Accept()
	if err != nil {
		// handle error
		continue
	}
	go handleConnection(conn)
}

客户端代码:

conn, err := net.Dial("tcp", "google.com:80")
if err != nil {
	// handle error
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
// ...