一.Go网络编程概述
1. 基本概念
- TCP 和 UDP: Go语言支持TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供可靠的、面向连接的通信,而UDP提供无连接的快速数据传输。
- 并发: Go语言的并发模型是通过goroutines实现的。每个网络请求都可以在自己的goroutine中处理,实现高效的并发。
- Channels: 用于在goroutines之间安全地传递数据。
2. net包
- 核心组件:
net
包提供了网络I/O的基础设施,包括TCP/UDP协议,以及DNS解析。
二.创建TCP服务器
1.监听端口
goCopy codeln, err := net.Listen("tcp", ":8080")
if err != nil {// 处理错误
}
2.接受连接并处理
goCopy codefor {conn, err := ln.Accept()if err != nil {// 处理错误continue}go handleConnection(conn)
}
3.处理连接
goCopy codefunc handleConnection(conn net.Conn) {// 使用conn读取和写入数据conn.Close()
}
三.创建TCP客户端
1.建立连接
goCopy codeconn, err := net.Dial("tcp", "localhost:8080")
if err != nil {// 处理错误
}
2.发送和接收数据
goCopy code// 发送数据
conn.Write([]byte("hello\n"))// 接收数据
bufio.NewReader(conn).ReadString('\n')
3.关闭连接
goCopy code
conn.Close()
4.使用UDP
-
建立UDP连接
goCopy code conn, err := net.Dial("udp", "localhost:8081")
-
发送和接收数据
goCopy codeconn.Write([]byte("hello")) buf := make([]byte, 1024) n, _, err := conn.ReadFromUDP(buf)
四.综合案例
1.服务端-server.go
package mainimport ("bufio""fmt""net"
)func main() {listener, err := net.Listen("tcp", "localhost:8888")if err != nil {fmt.Println("开启服务端错误:", err)return}defer listener.Close()for {conn, err := listener.Accept()if err != nil {fmt.Println("接收错误:", err)continue // 改为continue,可以处理下一个连接}go handleConnection(conn)}
}func handleConnection(conn net.Conn) {defer conn.Close()// 读取客户端数据message, err := bufio.NewReader(conn).ReadString('\n')if err != nil {fmt.Println("读取错误:", err)return}fmt.Println("Message Received:", message)// 回发数据response := "收到你的消息了:" + messageconn.Write([]byte(response))
}
2.客户端-client.go
package mainimport ("bufio""fmt""net"
)func main() {conn, err := net.Dial("tcp", "localhost:8888")if err != nil {fmt.Println("连接错误:", err)return}defer conn.Close()// 发送数据message := "玩游戏\n"_, err = conn.Write([]byte(message))if err != nil {fmt.Println("发送数据错误:", err)return}fmt.Println("发送数据:", message)// 读取响应response, err := bufio.NewReader(conn).ReadString('\n')if err != nil {fmt.Println("读取响应错误:", err)return}fmt.Println("收到响应:", response)
}