当前位置: 首页 > news >正文

Go基础:一文掌握Go语言网络编程

文章目录

    • 一、Go 语言网络编程概述
      • 1.1 核心概念
      • 1.2 连接管理
    • 二、TCP 网络编程
      • 2.1 TCP 服务器
      • 2.2 TCP 客户端
    • 三、UDP 网络编程
      • 3.1 UDP 服务器
      • 3.2 UDP 客户端
    • 四、HTTP 网络编程
      • 4.1 HTTP 服务器
      • 4.2 HTTP 客户端

一、Go 语言网络编程概述

Go 语言凭借其强大的标准库和原生的并发支持,非常适合用来开发高性能的网络服务。无论是构建 HTTP 服务器、RPC 服务,还是实现 TCP/UDP 通信,Go 都提供了简洁而强大的 API。

Go 语言通过 net 包提供了对 TCP/IP、UDP、域名解析、Unix 域套接字等网络协议的支持。net 包是 Go 网络编程的核心,它封装了底层的系统调用,提供了简洁易用的接口。

1.1 核心概念

  • Listener:用于监听和接受来自客户端的连接(如 net.Listen)。
  • Conn:代表一个网络连接,实现了 io.Readerio.Writer 接口,可以像读写文件一样读写网络数据。
  • Addr:表示一个网络地址(IP + Port)。
  • Dial:用于主动连接到服务器。
  • TCP:适用于需要可靠传输的场景,如文件传输、HTTP、数据库连接等。
  • UDP:适用于对实时性要求高、能容忍丢包的场景,如视频流、DNS、在线游戏等。
  • HTTP:基于 TCP 的应用层协议,Go 的 net/http 包提供了强大的 HTTP 客户端和服务器支持。
  • 并发模型:Go 的 Goroutine 和 Channel 使得网络编程更加高效和简洁,可以轻松处理大量并发连接。

1.2 连接管理

  • 对于 TCP 服务器,确保使用 defer conn.Close()。
  • 对于 HTTP 客户端,复用 http.Client 实例而不是频繁创建。
  • 总是 defer resp.Body.Close()。

二、TCP 网络编程

TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。Go 语言通过 net 包提供了对 TCP 的原生支持。

2.1 TCP 服务器

创建一个 TCP 服务器的标准流程是:监听 -> 接受连接 -> 处理连接。

TCP 服务器的基本流程:

  1. 监听指定端口。
  2. 接受客户端连接。
  3. 为每个连接启动一个 Goroutine 处理请求。
  4. 读取客户端数据并处理。
  5. 返回响应给客户端。

示例代码:简单的 TCP Echo 服务器

package main
import ("bufio""fmt""log""net"
)
func handleConnection(conn net.Conn) {defer conn.Close() // 确保连接关闭// 使用 bufio 读取客户端数据reader := bufio.NewReader(conn)for {message, err := reader.ReadString('\n')if err != nil {log.Println("Client disconnected:", err)return}log.Printf("Received: %s", message)// 将消息回显给客户端_, err = conn.Write([]byte("Echo: " + message))if err != nil {log.Println("Failed to send response:", err)return}}
}
func main() {// 监听 TCP 端口listener, err := net.Listen("tcp", ":8080")if err != nil {log.Fatal("Failed to listen:", err)}defer listener.Close()log.Println("TCP server started on :8080")for {// 接受客户端连接conn, err := listener.Accept()if err != nil {log.Println("Failed to accept connection:", err)continue}log.Println("New client connected:", conn.RemoteAddr())// 启动一个 Goroutine 处理连接go handleConnection(conn)}
}

2.2 TCP 客户端

客户端流程:连接 -> 读写 -> 关闭。

TCP 客户端的基本流程:

  1. 连接到服务器。
  2. 发送数据。
  3. 读取服务器响应。
  4. 关闭连接。

示例代码:TCP 客户端

package main
import ("bufio""fmt""log""net""os"
)
func main() {// 连接到 TCP 服务器conn, err := net.Dial("tcp", "localhost:8080")if err != nil {log.Fatal("Failed to connect:", err)}defer conn.Close()log.Println("Connected to TCP server")// 从标准输入读取用户输入reader := bufio.NewReader(os.Stdin)for {fmt.Print("Enter message: ")message, _ := reader.ReadString('\n')// 发送消息到服务器_, err := conn.Write([]byte(message))if err != nil {log.Println("Failed to send message:", err)return}// 读取服务器响应response, err := bufio.NewReader(conn).ReadString('\n')if err != nil {log.Println("Failed to read response:", err)return}fmt.Print("Server response: " + response)}
}

三、UDP 网络编程

UDP 是一种无连接的、不可靠的、面向数据报的传输层协议。与 TCP 不同,UDP 不保证数据包的顺序和可靠性,但开销更小,适用于对实时性要求高的场景(如视频流、DNS 查询)。

3.1 UDP 服务器

UDP 服务器的基本流程:

  1. 监听指定端口。
  2. 读取客户端发送的数据报。
  3. 处理数据并返回响应。

示例代码:UDP Echo 服务器

package main
import ("log""net"
)
func main() {// 监听 UDP 端口addr, err := net.ResolveUDPAddr("udp", ":8080")if err != nil {log.Fatal("Failed to resolve address:", err)}conn, err := net.ListenUDP("udp", addr)if err != nil {log.Fatal("Failed to listen:", err)}defer conn.Close()log.Println("UDP server started on :8080")buffer := make([]byte, 1024)for {// 读取客户端数据n, clientAddr, err := conn.ReadFromUDP(buffer)if err != nil {log.Println("Failed to read:", err)continue}log.Printf("Received from %s: %s", clientAddr, string(buffer[:n]))// 回显数据给客户端_, err = conn.WriteToUDP([]byte("Echo: "+string(buffer[:n])), clientAddr)if err != nil {log.Println("Failed to send response:", err)}}
}

3.2 UDP 客户端

示例代码:UDP 客户端

package main
import ("bufio""log""net""os"
)
func main() {// 解析服务器地址serverAddr, err := net.ResolveUDPAddr("udp", "localhost:8080")if err != nil {log.Fatal("Failed to resolve address:", err)}// 创建本地 UDP 连接conn, err := net.DialUDP("udp", nil, serverAddr)if err != nil {log.Fatal("Failed to dial:", err)}defer conn.Close()log.Println("Connected to UDP server")reader := bufio.NewReader(os.Stdin)for {fmt.Print("Enter message: ")message, _ := reader.ReadString('\n')// 发送消息_, err := conn.Write([]byte(message))if err != nil {log.Println("Failed to send message:", err)return}// 读取响应buffer := make([]byte, 1024)n, err := conn.Read(buffer)if err != nil {log.Println("Failed to read response:", err)return}fmt.Print("Server response: " + string(buffer[:n]))}
}

四、HTTP 网络编程

Go 语言内置了强大的 net/http 包,可以轻松构建 HTTP 客户端和服务器。

4.1 HTTP 服务器

示例代码:简单的 HTTP 服务器

package main
import ("fmt""log""net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
}
func main() {http.HandleFunc("/", helloHandler)log.Println("HTTP server started on :8080")log.Fatal(http.ListenAndServe(":8080", nil))
}

4.2 HTTP 客户端

示例代码:HTTP 客户端

package main
import ("fmt""io/ioutil""net/http"
)
func main() {resp, err := http.Get("http://localhost:8080/world")if err != nil {fmt.Println("Failed to make request:", err)return}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("Failed to read response:", err)return}fmt.Println("Response:", string(body))
}
http://www.dtcms.com/a/461180.html

相关文章:

  • TENGJUN-3.5MM耳机插座(JA06-BPF032-A):反向沉板结构下的4极音频连接解决方案
  • 使用IOT-Tree接入各种设备转OPC UA Server输出
  • 【大模型实战篇】从Python函数到MCP服务器:完整转换示例
  • 怎样增加网站的权重小企业做网站有用吗
  • 【ArkTS-通用事件】
  • 为什么要放弃用Docker?
  • 东方仙盟修仙(五)赛博科技修仙养老是一种爱好
  • 大模型训练过程中主动学习和课程学习的全面对比
  • Redis数据库隔离业务缓存对查询性能的影响分析
  • Mapper接口的解析
  • 网站中链接怎么做的广东网站建设案例
  • 网站开发部门结构公司做网站的费用属于什么费用
  • 做电影方面的网站怎么做外贸免费平台
  • transformers音频实战02-基于 Speech Commands 数据集的语音识别实战项目全流程
  • 天津做网站美工锦州网站建设信息
  • Terraform + RustFS 实战:10分钟实现对象存储 IaC 化,运维效率提升300%
  • 遇到RabbitMQ 的 `channel_max` 限制报错
  • 机器学习实战项目:Python+Flask 汽车销量分析可视化系统(requests爬车主之家+可视化 源码+文档)✅
  • 惠州城乡建设部网站印刷包装公司网站模板
  • WEB前端 JavaScript 学习笔记
  • 如何使用Python实现LRU缓存
  • OSCP渗透实战(第二期):Linux系统攻防与权限提升完全指南
  • LeetCode 118. 杨辉三角
  • AI原生应用架构白皮书 - AI原生应用架构及其关键要素
  • 蓝绿发布与金丝雀发布策略简介_笔记
  • 流媒体视频技术在明厨亮灶场景中的深度应用
  • 建设网站是否需要一个主机全球邮企业邮箱登录
  • 余弦相似度凭什么成了文本推荐的“方向指南针”?从几何夹角到语义匹配的AI密码
  • 解决Docker Hub被封的问题
  • 基于android的中天模拟键盘APP的设计与实现(初稿)