go网络编程

net包是网络相关的核心库。 net包里面包含了 http、rpc等关键包

在net 里面,最重要的两个调用:

  • Listen(network,addr string) 监听某个端口,等待客户端连接
  • Dial(network,addr string) 拨号,也就是连上某个服务端

应用协议的设计

如何读取 数据格式,数据格式有多长

通信阶段:

  • 客户端不断发送请求
  • 服务端读取请求
  • 服务端处理请求
  • 服务端写回请求

图 3

Listen是监听一端口,准备读取数据。 还有类似的接口

  • ListenTCP
  • ListenUDP
  • ListenIP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ln, err := net.Listen("tcp", ":8080")
if err != nil {
        // handle error
}
for {
    conn, err := ln.Accept()
    if err != nil {
            // handle error
    }
    go handleConnection(conn)
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ...上上边代码补充...
// 客户端连接后处理逻辑
func handler(newConn net.Conn){
    for{
        // 新建一个位置用于存放客户端数据
        msg := make([]byte,1024)
        num,err := newConn.Read(msg)
        switch err {
            //可以打印异常的种类
            case io.EOF:
            case io.ErrClosed:
            case io.ErrUnexpectedEOF: 
            default:

        }

        if err != nil{
            // 打印错误信息
        }
        fmt.Println("客户端消息:"+msg)
    }
    
}

net.Dial 使用: net.Dial 用于创建一个连接,连接远端的服务器。

  • DialIP
  • DialTCP
  • DialUDP
  • DialUnix
  • DialTimeout
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
func Connect(add string) error {
    conn,err := net.DialTimeout("tcp",addr,3*time.Second)
    if err!=nil {
        return err
    }
    defer conn.Close()
    for {
        _,err := conn.Write([]byte("aaa"))
        if err!=nil { return err}
        res := make([]byte,128)
        _,err = conn.Read(res)
        if err!=nil {
            return err
        }
    }
}

数据协议原理

如何设计协议:

  1. 数据头部- 定义了数据长度的信息, 通过读取长度 我们知道后面的 body 要读多长
    • 如何定义压缩算法, 版本
  2. 数据body - 具体编码内容