golang套接字

在 Go 语言中,使用标准库 net 来实现套接字编程。以下是有关 Go 套接字的基本概念和示例。

1. 基本概念

  • 网络类型
    • TCP:流套接字,提供可靠的、面向连接的通信。
    • UDP:数据报套接字,无连接,适用于快速传输。

2. TCP 套接字示例

服务器端代码
go 复制代码
package main

import (
    "fmt"
    "net"
)

func main() {
    // 创建 TCP 套接字
    listener, err := net.Listen("tcp", ":12345")
    if err != nil {
        fmt.Println("Error starting server:", err)
        return
    }
    defer listener.Close()

    fmt.Println("Waiting for a connection...")
    for {
        // 接受连接
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            continue
        }
        fmt.Println("Connection established from", conn.RemoteAddr())

        // 处理连接
        go handleConnection(conn)
    }
}

func handleConnection(conn net.Conn) {
    defer conn.Close()
    message := "Hello, Client!"
    conn.Write([]byte(message))
    fmt.Println("Message sent to client:", message)
}
客户端代码
go 复制代码
package main

import (
    "fmt"
    "net"
)

func main() {
    // 连接到服务器
    conn, err := net.Dial("tcp", "localhost:12345")
    if err != nil {
        fmt.Println("Error connecting to server:", err)
        return
    }
    defer conn.Close()

    // 接收数据
    buffer := make([]byte, 1024)
    n, err := conn.Read(buffer)
    if err != nil {
        fmt.Println("Error reading from server:", err)
        return
    }

    fmt.Println("Received message from server:", string(buffer[:n]))
}

3. UDP 套接字示例

服务器端代码
go 复制代码
package main

import (
    "fmt"
    "net"
)

func main() {
    // 创建 UDP 套接字
    address, err := net.ResolveUDPAddr("udp", ":12345")
    if err != nil {
        fmt.Println("Error resolving address:", err)
        return
    }

    conn, err := net.ListenUDP("udp", address)
    if err != nil {
        fmt.Println("Error listening:", err)
        return
    }
    defer conn.Close()

    fmt.Println("Waiting for a connection...")
    for {
        buffer := make([]byte, 1024)
        n, addr, err := conn.ReadFromUDP(buffer)
        if err != nil {
            fmt.Println("Error reading from UDP:", err)
            continue
        }
        fmt.Println("Received message from", addr, ":", string(buffer[:n]))

        // 发送响应
        response := []byte("Hello, UDP Client!")
        conn.WriteToUDP(response, addr)
    }
}
客户端代码
go 复制代码
package main

import (
    "fmt"
    "net"
)

func main() {
    // 发送 UDP 数据包
    address, err := net.ResolveUDPAddr("udp", "localhost:12345")
    if err != nil {
        fmt.Println("Error resolving address:", err)
        return
    }

    conn, err := net.DialUDP("udp", nil, address)
    if err != nil {
        fmt.Println("Error connecting:", err)
        return
    }
    defer conn.Close()

    message := []byte("Hello, Server!")
    conn.Write(message)

    // 接收响应
    buffer := make([]byte, 1024)
    n, _, err := conn.ReadFromUDP(buffer)
    if err != nil {
        fmt.Println("Error reading from server:", err)
        return
    }

    fmt.Println("Received message from server:", string(buffer[:n]))
}

4. 运行示例

  1. 首先在一个终端中运行服务器代码。
  2. 然后在另一个终端中运行客户端代码。

总结

Go 语言的 net 包使得套接字编程变得简单而高效。通过使用 TCP 或 UDP 套接字,你可以轻松实现网络通信。若有其他问题或需要更深入的内容,请随时问我!

相关推荐
martinzh23 分钟前
Spring AI 项目介绍
后端
Thomas_YXQ30 分钟前
Unity URP法线贴图实现教程
开发语言·unity·性能优化·游戏引擎·unity3d·贴图·单一职责原则
前端付豪32 分钟前
20、用 Python + API 打造终端天气预报工具(支持城市查询、天气图标、美化输出🧊
后端·python
爱学习的小学渣34 分钟前
关系型数据库
后端
武子康37 分钟前
大数据-33 HBase 整体架构 HMaster HRegion
大数据·后端·hbase
前端付豪38 分钟前
19、用 Python + OpenAI 构建一个命令行 AI 问答助手
后端·python
凌览38 分钟前
斩获 27k Star,一款开源的网站统计工具
前端·javascript·后端
Zz_waiting.41 分钟前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象
全栈凯哥41 分钟前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
Touper.1 小时前
JavaSE -- 泛型详细介绍
java·开发语言·算法