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 套接字,你可以轻松实现网络通信。若有其他问题或需要更深入的内容,请随时问我!

相关推荐
এ慕ོ冬℘゜40 分钟前
原生 JS 实现自定义单选日历组件(无 UI 库、纯手写、禁用过去日期)
开发语言·javascript·ui
Ulyanov1 小时前
刚体动力学方程——牛顿-欧拉与陀螺效应的奥秘
开发语言·python·目标跟踪·雷达电子对抗·导引头
罗超驿1 小时前
15.Java异常处理:从束手无策到从容应对
java·开发语言
千桐科技1 小时前
🚀 qModel 算法模型平台v1.2.0 开源版发布!Python 模型接入链路全面升级,告别“能跑但上不了线”的尴尬
后端·算法·llm
用户40966601317511 小时前
实时数据大屏的 4 种推送方案:短轮询 → 长轮询 → SSE → WebSocket
后端·面试
MoonBit月兔1 小时前
MoonBit v0.10.4版本更新
开发语言·人工智能·编程·moonbit
小樱花的樱花1 小时前
Linux 多线程编程:互斥锁(Mutex)详解
linux·c语言·开发语言
yinshaojun0011 小时前
Function Calling:从模型输出到安全的工具执行
后端
码事漫谈2 小时前
让 AI 直接操作数据库:电科金仓 KES MCP Server 实践
后端
滴滴滴嘟嘟嘟.2 小时前
强化学习-PPO 奖励塑形实验:Pendulum-v1 中角速度惩罚权重的影响
开发语言·python