Go网络编程:基于TCP的网络服务端与客户端

简介: 本文介绍了使用 Go 语言的 `net` 包开发 TCP 网络服务的基础与进阶内容。首先简述了 TCP 协议的基本概念和通信流程,接着详细讲解了服务端与客户端的开发步骤,并提供了简单回显服务的示例代码。同时,文章探讨了服务端并发处理连接的方法,以及粘包/拆包、异常检测、超时控制等进阶技巧。最后通过群聊服务端的实战案例巩固知识点,并总结了 TCP 在高可靠性场景中的优势及 Go 并发模型带来的便利性。

 

Go 语言的 net 包为网络编程提供了简洁高效的接口。我们可以使用它快速构建 TCP 网络服务,如聊天服务器、RPC、微服务通信等。


一、TCP简介

TCP(Transmission Control Protocol)是面向连接的、可靠的传输协议,通信模型为客户端-服务端(Client-Server)。

基本流程:

Client -----> Server(连接)
Client <----> Server(数据收发)
Client -----X Server(断开)

二、TCP服务端开发流程

1. 基本步骤

  • • 创建监听器 net.Listen("tcp", address)
  • • 接收连接 ln.Accept()
  • • 启动协程处理每个连接

2. 示例代码:简单回显服务端

package main
import (
    "bufio"
    "fmt"
    "net"
)
func main() {
    ln, err := net.Listen("tcp", ":8000")
    if err != nil {
        panic(err)
    }
    fmt.Println("Server is listening on :8000...")
    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println("Accept error:", err)
            continue
        }
        go handleConnection(conn)
    }
}
func handleConnection(conn net.Conn) {
    defer conn.Close()
    fmt.Println("Client connected:", conn.RemoteAddr())
    scanner := bufio.NewScanner(conn)
    for scanner.Scan() {
        msg := scanner.Text()
        fmt.Println("Received:", msg)
        conn.Write([]byte("Echo: " + msg + "\n"))
    }
}

三、TCP客户端开发流程

1. 基本步骤

  • • 使用 net.Dial("tcp", address) 发起连接
  • • 使用 conn.Write() 发送数据
  • • 使用 conn.Read()bufio.Scanner 接收响应

2. 示例代码:简单回显客户端

package main
import (
    "bufio"
    "fmt"
    "net"
    "os"
)
func main() {
    conn, err := net.Dial("tcp", "localhost:8000")
    if err != nil {
        panic(err)
    }
    defer conn.Close()
    fmt.Println("Connected to server.")
    scanner := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("Input: ")
        if !scanner.Scan() {
            break
        }
        text := scanner.Text()
        conn.Write([]byte(text + "\n"))
        reply := bufio.NewReader(conn)
        msg, _ := reply.ReadString('\n')
        fmt.Print("Server reply: " + msg)
    }
}

四、服务端并发处理连接

  • • 每个连接使用 go handleConnection(conn) 启动一个 goroutine。
  • • 利用 channel、sync 等包实现更复杂的控制逻辑。
  • • 避免 goroutine 泄漏,及时关闭连接。

五、进阶技巧与注意事项

问题 建议
粘包/拆包问题 采用固定长度协议或使用 \n 等分隔符协议
异常断开检测 读取错误后及时清理资源
超时控制 使用 conn.SetDeadline 设置读写超时
多客户端广播/聊天群 使用 map 管理连接池,遍历发送消息

六、实战小案例:群聊服务端片段

var clients = make(map[net.Conn]string)
var broadcast = make(chan string)
func main() {
    go broadcaster()
    // 省略监听与连接处理...
}
func handleConnection(conn net.Conn) {
    defer conn.Close()
    clients[conn] = conn.RemoteAddr().String()
    for scanner.Scan() {
        msg := scanner.Text()
        broadcast <- clients[conn] + ": " + msg
    }
    delete(clients, conn)
}
func broadcaster() {
    for {
        msg := <-broadcast
        for conn := range clients {
            fmt.Fprintln(conn, msg)
        }
    }
}

七、总结

  • • TCP 是基础但强大的通信方式,适用于高可靠性场景。
  • • Go 的并发模型使构建高性能网络服务变得简单。
  • • 在生产环境中,还需结合日志、连接池、协议封装等技术。

 

相关文章
|
18天前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
150 61
|
16天前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
3月前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
849 4
|
5月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
138 20
|
5月前
|
网络协议 算法 安全
Go语言的网络编程与TCP_UDP
Go语言由Google开发,旨在简单、高效和可扩展。本文深入探讨Go语言的网络编程,涵盖TCP/UDP的基本概念、核心算法(如滑动窗口、流量控制等)、最佳实践及应用场景。通过代码示例展示了TCP和UDP的实现,并讨论了其在HTTP、DNS等协议中的应用。最后,总结了Go语言网络编程的未来发展趋势与挑战,推荐了相关工具和资源。
129 5
|
Go vr&ar 编解码
golang ffmpeg 做网络直播
最近在公司做在线视频转码的工作,研究了下ffmpeg 最后直接研究了下网络直播,我是在我自己的mac 上面测试的,效果,还可以,先看看效果图吧 ffmpeg 我是通过brew安装 的,这步就略了 VLC这个播放器怎么安装的也略了 我先是在github上面找了一个开源的直播流工具 https://github.
4048 0
|
5月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
5月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
15天前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
16天前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。