网络编程
TCP/IP 协议:
1. TCP(传输控制协议) -- 应用程序之间通信 2. UDP(用户数据包协议)-- 应用程序之间的简单通信 3. IP(网际协议) -- 计算机之间的通信 4. DHCP(动态主机配置协议) -- 针对动态寻址
go服务端的处理流程:
a. 监听端口 b. 接收客户端的连接 c. 创建 goroutine,处理该连接
示例代码:
package main
import (
"fmt"
"net" // 网络相关的包都在这个 net 包里面
)
func main(){
fmt.Println("start server...")
// 1. 监听ip和端口
listen,err := net.Listen("tcp","0.0.0.0:50000") // 监听端口;第一个参数是监听什么类型的协议,第二个参数是监听的 端口, 0.0.0.0 表示监听这台机器上的所有 ip (监听所有的网卡)
if err != nil {
fmt.Println("listen failed,err:",err)
return
}
// 2. 接收连接
for {
conn,err := listen.Accept() // 接收连接;conn 表示与当前用户之间的通信的管道(连接)
if err != nil {
fmt.Println("accept failed,err:",err)
continue
}
// 3. 创建 goroutine 去处理该连接
go process(conn) // 新起一个 goroutine 去处理这个连接
}
}
func process(conn net.Conn){ // net.Conn 类型
defer conn.Close() // 执行完后要把连接关掉,要不然会造成资源泄露
for {
buf := make([]byte,512) // 网络连接发过来的是字节流,所以定义一个 byte 切片
_ , err := conn.Read(buf) // conn.Read()接收的是一个 byte切片; 从 conn 这个对象里面 读取客户端发来的数,保存到 buf数组 中; conn.Read() 返回两个参数:第一个参数是读取到了多少个字节,第二个是 error
if err != nil {
fmt.Println("read err:",err)
return
}
fmt.Print("read:",string(buf)) // 把 byte切片 转换为 字符串
}
}
go客户端的处理流程:
a. 建立与服务端的连接 b. 进行数据接收 c. 关闭连接