go网络编程
net包是网络相关的核心库。 net包里面包含了 http、rpc等关键包
在net 里面,最重要的两个调用:
Listen(network,addr string)
监听某个端口,等待客户端连接
Dial(network,addr string)
拨号,也就是连上某个服务端
应用协议的设计
如何读取 数据格式,数据格式有多长
通信阶段:
- 客户端不断发送请求
- 服务端读取请求
- 服务端处理请求
- 服务端写回请求
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
}
}
}
|
数据协议原理
如何设计协议:
- 数据头部- 定义了数据长度的信息, 通过读取长度 我们知道后面的 body 要读多长
- 数据body - 具体编码内容