使用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')
// ...