登录
首页 >  Golang >  Go教程

Golangnet包实现TCP通信详解

时间:2025-10-25 18:25:31 263浏览 收藏

本文详细介绍了如何使用 Golang 的 `net` 包实现 TCP 通信,并提供了完整的客户端和服务器端代码示例。通过 `net.Listen` 函数,服务器端可以监听指定端口,等待客户端连接,并使用 Goroutine 并发处理多个连接。客户端则通过 `net.Dial` 函数连接服务器,并使用 `Read` 和 `Write` 函数进行数据收发。教程重点讲解了 TCP 通信的核心步骤,包括服务器监听、客户端连接、数据读写以及连接关闭和错误处理等关键细节,尤其强调了 TCP 字节流协议下消息边界的处理方法,助你快速掌握 Golang TCP 通信的开发技巧。

使用net包实现TCP通信,服务器通过net.Listen监听端口,accept连接后用goroutine处理;客户端用net.Dial连接,通过Read/Write收发数据,注意消息边界与错误处理。

如何在Golang中使用net包实现TCP通信

在Golang中,net包提供了对网络I/O的支持,包括TCP、UDP和Unix域套接字等。实现TCP通信主要依赖于net.Listennet.Dial两个核心函数。下面介绍如何使用net包完成一个简单的TCP客户端与服务器通信。

创建TCP服务器

TCP服务器需要监听指定的地址和端口,等待客户端连接。每当有新连接建立时,启动一个协程处理该连接,保证服务器可以同时服务多个客户端。

示例代码:

package main

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

func main() {
    // 监听本地8080端口
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("监听失败:", err)
        return
    }
    defer listener.Close()
    fmt.Println("服务器已启动,监听 :8080...")

    for {
        // 接受客户端连接
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("接受连接失败:", err)
            continue
        }

        // 启动协程处理连接
        go handleConnection(conn)
    }
}

func handleConnection(conn net.Conn) {
    defer conn.Close()
    scanner := bufio.NewScanner(conn)
    for scanner.Scan() {
        message := strings.TrimSpace(scanner.Text())
        fmt.Printf("收到消息: %s\n", message)

        // 回显消息给客户端
        response := fmt.Sprintf("你发送的是: %s\n", message)
        conn.Write([]byte(response))
    }
}

创建TCP客户端

客户端通过net.Dial连接到服务器,然后可以发送数据并读取响应。

示例代码:

package main

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

func main() {
    // 连接到本地8080端口
    conn, err := net.Dial("tcp", "127.0.0.1:8080")
    if err != nil {
        fmt.Println("连接失败:", err)
        return
    }
    defer conn.Close()

    fmt.Println("已连接到服务器")

    // 从标准输入读取用户输入
    input := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("请输入消息: ")
        if !input.Scan() {
            break
        }

        line := input.Text()
        if line == "quit" {
            break
        }

        // 发送数据到服务器
        _, err := conn.Write([]byte(line + "\n"))
        if err != nil {
            fmt.Println("发送失败:", err)
            break
        }

        // 读取服务器响应
        buffer := make([]byte, 1024)
        n, err := conn.Read(buffer)
        if err != nil {
            fmt.Println("读取响应失败:", err)
            break
        }

        fmt.Printf("服务器回复: %s", string(buffer[:n]))
    }
}

运行说明

先启动服务器程序,再运行客户端。客户端输入任意文本后,服务器会回显处理结果。输入quit可退出客户端。

  • 服务器使用net.Listen("tcp", ":8080")监听所有IP的8080端口
  • 每个连接由独立的goroutine处理,避免阻塞其他客户端
  • 客户端通过net.Dial发起连接,并使用WriteRead进行通信
  • 注意:TCP是字节流协议,需自行处理消息边界(本例以换行符分隔)
基本上就这些。不复杂但容易忽略细节,比如连接关闭和错误处理。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>