使用Go创建一个TCP服务器的操作步骤

 更新时间:2025年08月04日 08:22:23   作者:程序员爱钓鱼  
在网络编程中,TCP 是最常见的传输协议之一,Go 提供了 net 包,可以方便地实现 TCP 服务器与客户端通信,本篇将以实战形式演示如何用 Go 创建一个 TCP 服务器,并让多个客户端与之通信,需要的朋友可以参考下

一、实战背景

相比 HTTP 请求响应,TCP 通信更底层、更灵活,适合用在:

  • 游戏服务器
  • 实时聊天程序
  • 长连接服务
  • 数据同步服务

本案例将实现一个简单的 TCP 聊天 服务器:

  • 支持多个客户端连接
  • 客户端发送内容,服务器打印并回应
  • 演示并发连接处理

二、实战目标

构建一个简单的 TCP 网络程序,包含两个组件:

TCP服务器

  • 启动监听指定端口
  • 接收多个客户端连接
  • 每条连接独立处理,读取数据并回复

TCP客户端

  • 连接到服务器
  • 从终端输入消息并发送
  • 接收服务器返回的响应

三、完整代码实现

1. TCP服务器代码(server.go)

package main

import (
    "bufio"
    "fmt"
    "net"
    "strings"
)

func handleConnection(conn net.Conn) {
    defer conn.Close()
    addr := conn.RemoteAddr().String()
    fmt.Println("客户端连接:", addr)

    reader := bufio.NewReader(conn)
    for {
        data, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("客户端断开:", addr)
            return
        }
        msg := strings.TrimSpace(data)
        fmt.Printf("收到[%s]: %s\n", addr, msg)

        // 回复消息
        response := fmt.Sprintf("服务端收到: %s\n", msg)
        conn.Write([]byte(response))
    }
}

func main() {
    listener, err := net.Listen("tcp", ":8888")
    if err != nil {
        fmt.Println("启动失败:", err)
        return
    }
    defer listener.Close()

    fmt.Println("TCP服务器已启动,监听端口 8888...")
    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("连接失败:", err)
            continue
        }
        go handleConnection(conn)
    }
}

2. TCP客户端代码(client.go)

package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
    "strings"
)

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:8888")
    if err != nil {
        fmt.Println("连接服务器失败:", err)
        return
    }
    defer conn.Close()

    fmt.Println("已连接到服务器。请输入消息,输入 exit 退出:")

    reader := bufio.NewReader(os.Stdin)
    for {
        fmt.Print(">> ")
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        if input == "exit" {
            fmt.Println("断开连接")
            return
        }

        // 发送消息
        conn.Write([]byte(input + "\n"))

        // 接收服务器响应
        response, _ := bufio.NewReader(conn).ReadString('\n')
        fmt.Println("服务器响应:", strings.TrimSpace(response))
    }
}

四、运行方式

启动服务器

go run server.go

输出示例:

TCP服务器已启动,监听端口 8888...

启动客户端(多个终端可同时运行)

go run client.go

输入消息:

>> hello
服务器响应: 服务端收到: hello

服务器端输出:

客户端连接: 127.0.0.1:53458
收到[127.0.0.1:53458]: hello

五、关键技术点解析

1. net.Listen("tcp", ":8888")

用于监听本地 8888 端口,协议为 TCP。支持 IPv4、IPv6。

2. listener.Accept()

阻塞方法,等待客户端连接。每当有新连接,就返回一个 net.Conn

3. 并发处理连接

使用 go handleConnection(conn),每个客户端独立处理,避免阻塞。

4. bufio.NewReader(conn).ReadString('\n')

按行读取客户端发送内容。注意客户端必须发送换行(\n)结束,否则会阻塞。

5. 客户端 net.Dial

客户端使用 net.Dial("tcp", addr) 建立连接。注意服务端地址和端口应正确。

六、可扩展方向

方向实现建议
广播机制使用 map[conn]bool 存储连接,广播消息
客户端昵称每个连接输入昵称,并用于标识消息来源
心跳检测定期向客户端发送 ping,判断是否掉线
JSON 协议使用结构化数据通讯
TLS 加密通信使用 crypto/tls 加密 TCP 通道
多线程聊天室支持多房间并发聊天

七、小结

通过本案例你掌握了:

  • 如何编写基本的 TCP 服务端和客户端
  • 使用 Goroutine 实现并发连接处理
  • 使用 bufio.Reader/Writer 实现按行读写
  • 终端交互式发送/接收消息

这是构建分布式系统、即时通讯、远程控制服务的基础能力。

到此这篇关于使用Go创建一个TCP服务器的操作步骤的文章就介绍到这了,更多相关Go创建TCP服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • grpcurl通过命令行访问gRPC服务

    grpcurl通过命令行访问gRPC服务

    这篇文章主要为大家介绍了grpcurl通过命令行访问gRPC服务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang操作DuckDB实战案例分享

    Golang操作DuckDB实战案例分享

    DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性,凭借其在以内存为中心的环境中处理高速分析的能力,它迅速受到数据科学家和分析师的欢迎,在这篇博文中,我们将探索在Go中使用DuckDB
    2025-01-01
  • Go语言简易图像验证码生成的实战案例

    Go语言简易图像验证码生成的实战案例

    本篇我们将使用Go语言结合第三方库 github.com/mojocn/base64Captcha,快速实现一个简易图像验证码生成接口,具有一定的参考价值,感兴趣的可以了解一下
    2025-08-08
  • golang 调用c语言动态库方式实现

    golang 调用c语言动态库方式实现

    本文主要介绍了golang 调用c语言动态库方式实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 详解如何通过Go来操作Redis实现简单的读写操作

    详解如何通过Go来操作Redis实现简单的读写操作

    作为最常用的分布式缓存中间件——Redis,了解运作原理和如何使用是十分有必要的,今天来学习如何通过Go来操作Redis实现基本的读写操作,需要的朋友可以参考下
    2023-09-09
  • Go整合Redis2.0发布订阅的实现

    Go整合Redis2.0发布订阅的实现

    本文主要介绍了Go整合Redis2.0发布订阅,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • 详解Go语言如何实现类似Python中的with上下文管理器

    详解Go语言如何实现类似Python中的with上下文管理器

    熟悉 Python 的同学应该知道 Python 中的上下文管理器非常好用,那么在 Go 中是否也能实现上下文管理器呢,下面小编就来和大家仔细讲讲吧
    2023-07-07
  • Go map底层实现与扩容规则和特性分类详细讲解

    Go map底层实现与扩容规则和特性分类详细讲解

    这篇文章主要介绍了Go map底层实现与扩容规则和特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • Go语言操作MySql数据库的详细指南

    Go语言操作MySql数据库的详细指南

    数据的持久化是程序中必不可少的,所以编程语言中对数据库的操作是非常重要的一块,这篇文章主要给大家介绍了关于Go语言操作MySql数据库的相关资料,需要的朋友可以参考下
    2023-10-10
  • Swaggo零基础入门教程

    Swaggo零基础入门教程

    swagger是一套基于OpenAPI规范构建的开源工具,使用RestApi。swagger-ui呈现出来的是一份可交互式的API文档,可以直接在文档页面尝试API的调用
    2023-01-01

最新评论